繁体   English   中英

AWS Python Lambda Function - Write a UTF-8 encoded CSV to S3

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM