在 aws lambda 中在 python 中从 ANSI 转换为 UTF-8
Posted
技术标签:
【中文标题】在 aws lambda 中在 python 中从 ANSI 转换为 UTF-8【英文标题】:Converting from ANSI to UTF-8 in python within a aws lambda 【发布时间】:2022-01-09 20:10:00 【问题描述】:我在 s3 存储桶中收到一个 zip 文件。在它的 put 事件中,我触发了一个 aws lambda。 我的 lambda 应该解压缩文件并将其中的文件上传到另一个 s3 存储桶。
但这些文件可以是 ANSI 和 UTF-8 文件的混合。
我必须将所有这些都转换为 UTF-8。 知道我该怎么做吗?
def get_utf_encoded_file(
file,
file_name: str
):
is_ansi = False
try:
file.read().decode('utf-8')
except:
try:
file.read().decode('cp1252') << I tried to print here, gives empty string
is_ansi = True
except Exception as e:
log.error(f"Unable to parse file file_name")
raise Exception(f"Unable to parse file file_name")
if is_ansi:
byte_stream = None
temp_file_name = "/tmp/" + str(uuid.uuid4()) + ".txt"
with codecs.open(temp_file_name, "w", encoding='UTF-8') as temp_file:
temp_file.write(file.read().decode('cp1252'))
with open(temp_file_name, "rb") as temp_file:
byte_stream = temp_file.read() << I tried print here gives empty byte array
print(byte_stream)
os.remove(temp_file_name)
return byte_stream
else:
return file
调用它的函数:
def unzip_to_temp(
zip: ZipFile
):
for file_name in zip.namelist():
file_data = get_utf_encoded_file(file_name, zip.open(file_name))
upload_to_s3(file_data)
但是 ansi 文件在 s3 中被创建为空文件。
【问题讨论】:
【参考方案1】:您多次致电file.read()
。你总是为utf-8
阅读它,而你为ANSI
所做的阅读会得到空字符串。
您应该调用一次并保存结果,然后进行解码。
参考:https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects
【讨论】:
当然是的——我怎么会错过这个。谢谢你指出。【参考方案2】:您正试图从同一个文件多次调用read
。在第一个read
之后,指针将位于文件末尾,因此不会读取任何新内容。
除此之外,您可以只读取数据一次,然后尝试对其进行解码。而且由于您在内存中对其进行解码,因此您可以跳过一起写入磁盘并返回字符串的编码版本:
def get_utf_encoded_file(
file,
file_name: str
):
data = file.read()
try:
data.decode('utf-8')
# data decodes cleanly as utf-8
return data
except:
pass
try:
data = data.decode('cp1252').encode("utf-8")
# data decodes cleanly as cp1252, is now utf-8
return data
except:
log.error(f"Unable to parse file file_name")
raise Exception(f"Unable to parse file file_name")
【讨论】:
以上是关于在 aws lambda 中在 python 中从 ANSI 转换为 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章
在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝
在 AWS Lambda 函数中从 S3 获取对象并发送到 Api Gateway
试图在AWS Lambda上运行python脚本,但是如果加载virtualenv目录,Lambda会失败