【问题标题】:AWS Python Lambda Function - Write a UTF-8 encoded CSV to S3AWS Python Lambda 函数 - 将 UTF-8 编码的 CSV 写入 S3
【发布时间】:2021-04-18 19:07:42
【问题描述】:

我正在尝试从 Lambda 函数内部将 CSV 文件写入我的 S3 存储桶。一切都很好,除了我无法捕获特殊字符;基本上我需要我的文件是 UTF-8 编码的。我不想使用 pandas 或 unicodecsv,因为它们不是 Lambda 环境内置的。

以下是我当前的 Lambda 函数:

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”文件夹中。我也不需要打包和上传 pandas/unicodecsv 到我的 Lambda 环境;对于我这样的初学者来说太复杂了。回答时请记住这一点。

【问题讨论】:

  • Python3 字符串已经是 UTF8。 are still not UTF-8. 是什么意思?文字是否乱码?您是否期望非英文字符会以某种方式发生变化?本页是UTF8,你贴的代码是UTF8,"ğ"是一个单字符的UTF8字符串
  • 创建并下载的csv文件有5列5行。 ş 和 ğ 的值显示为 ÅŸ 和 ÄŸ。我相信生成的 csv 不是 UTF-8
  • 不,这正是当您打开 UTF8 时的样子,就好像它是 Latin1 一样。什么操作系统。你用吗?什么。语言环境。设置?你用哪个程序来读取文件?
  • 把相关信息放在question中,而不是cmets。我敢打赌你是双击文件而不是导入它。当您这样做时,Excel 会使用默认值导入文件的内容。非 UTF16 文本的默认设置是使用用户的区域设置。 saving CSVs as "utf-8-sig" 但在这里你使用了utf-8,它不会发出 BOM,告诉 Excel 这是一个 UTF8 文件
  • 这与 Lambda 甚至 Python 无关——除了使用 utf-8-sig 而不是 utf-8。如果要创建 Excel 文件,可以使用 opepyxl 之类的库来创建真正的 Excel 文件。您现在要做的是强制 Excel 使用默认值导入一个文本文件。如果您使用 Data > Import 菜单,您将能够指定编码。现在 Excel 必须猜测

标签: python amazon-s3 lambda aws-lambda


【解决方案1】:

简答

文件已经是 UTF8,没有 BOM。要发出 BOM,请在编码时使用 utf-8-sig 而不是 utf-8。

长答案

在 cmets 中,您似乎正试图通过双击文件在 Excel 中打开 CSV 文件。当您这样做时,Excel 将使用默认设置导入文件内容。如果存在 BOM,Excel 将使用 BOM 指定的编码加载文件。没有它就无法猜测使用了什么编码,因此 Excel 将使用用户的区域设置来导入数据。

如果您使用“数据”菜单导入数据,Excel 会显示文件预览并允许您修改编码、分隔符等设置。

如果您想在 Excel 中使用该文件,最好使用像 openpyxl 这样的库来创建一个真正的 xlsx 文件。 xlsx 是一个包含定义良好的 XML 文件的 ZIP 包。 xlsx 文件通常比等效的 CSV 文件小很多,并且没有数字和日期的本地化问题。

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 2023-03-27
    • 2017-03-04
    • 1970-01-01
    • 2021-02-07
    • 2018-06-13
    • 1970-01-01
    • 2021-01-27
    • 2014-02-03
    相关资源
    最近更新 更多