【发布时间】: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