![](/img/trans.png)
[英]Write csv file and save it into S3 using AWS Lambda (python)
[英]AWS Python Lambda Function - Write a UTF-8 encoded CSV to S3
我正在尝试从 Lambda function 内部将 CSV 文件写入我的 S3 存储桶。 一切都很好,除了我无法捕获特殊字符; 基本上我需要我的文件是 UTF-8 编码的。 我不想使用 pandas 或 unicodecsv,因为它们不是 Lambda 环境内置的。
下面是我当前的 Lambda function:
import boto3
import csv
import io
def lambda_handler(event, context):
s3 = boto3.resource('s3')
bucket = s3.Bucket("my-bucket-name-goes-here")
fn = "sample_csv_lambda.csv"
write_csv(fn, bucket)
def write_csv(target_filename, bucket):
buff = io.StringIO()
writer = csv.writer(buff, dialect="excel", delimiter=",")
writer.writerow([f"header{i}" for i in range(1, 6)])
writer.writerow([1, 2, 3, 4, 5])
writer.writerow(["u", "b", "w", "d", "ş"])
writer.writerow(["n", "p", "m", "q", "ğ"])
buff2 = io.BytesIO(buff.getvalue().encode(encoding="UTF-8"))
print(buff2.getvalue().decode("utf-8"))
bucket.upload_fileobj(buff2, target_filename)
倒数第二行的打印值按预期输出特殊字符,但是一旦我下载并打开 CSV 文件,其中的字符仍然不是 UTF-8。
PS:我喜欢我的代码的当前公式,因为我不需要像其他一些问题/答案所建议的那样将文件临时保存在“/tmp”文件夹中。 我也不需要 package 并将 pandas/unicodecsv 上传到我的 Lambda 环境; 对于我这样的初学者来说太复杂了。 回答时请记住这一点。
简答
该文件已经是 UTF8,没有 BOM。 要发出 BOM,请在编码时使用utf-8-sig
而不是utf-8
。
长答案
从评论来看,您似乎正试图通过双击文件来打开 Excel 中的 CSV 文件。 当您这样做时,Excel 将使用默认设置导入文件内容。 如果存在 BOM,Excel 将使用 BOM 指定的编码加载文件。 没有它就无法猜测使用了什么编码,因此 Excel 将使用用户的区域设置来导入数据。
如果您使用数据菜单导入数据,Excel 将显示文件预览并允许您修改编码、分隔符等设置。
如果您想将该文件与 Excel 一起使用,最好使用openpyxl
之类的库来创建一个真正的xlsx
文件。 xlsx
是 ZIP package 包含定义良好的 XML 文件。 xlsx
文件通常比等效的 CSV 文件小很多,并且没有数字和日期的本地化问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.