AWS Lambda环境下用Python实现ANSI转UTF-8的问题求助
问题根因与修复方案
核心问题
- 类文件对象调用
read()方法后,读取指针会移动到文件末尾,后续无偏移的read()调用都会返回空值。你在UTF-8解码校验、CP1252解码校验、写入临时文件三个步骤分别调用了三次read(),只有第一次能拿到文件真实内容,后两次读取全部为空,最终输出的文件自然是空文件。 - 函数参数顺序传递错误:你定义
get_utf_encoded_file时第一个参数是file、第二个是file_name,但调用时传的是get_utf_encoded_file(file_name, zip.open(file_name)),参数对应错位也会导致逻辑异常。
修复方案
优化逻辑避免重复读取文件对象,同时删除冗余的本地临时文件IO操作,直接在内存完成编码转换,降低Lambda运行开销,修复后代码如下:
import uuid import codecs import logging from zipfile import ZipFile log = logging.getLogger() def get_utf_encoded_file(file, file_name: str): # 第一次读取就把所有字节存到变量,后续所有操作都用这个变量 raw_content = file.read() is_ansi = False try: raw_content.decode('utf-8') except UnicodeDecodeError: try: raw_content.decode('cp1252') 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: # 直接在内存转码,不需要写入临时文件 return raw_content.decode('cp1252').encode('utf-8') else: # 本身就是UTF-8编码,直接返回原始字节 return raw_content
调用部分修正参数顺序:
def unzip_to_temp(zip: ZipFile): for file_name in zip.namelist(): # 修正参数顺序,第一个传文件对象,第二个传文件名 file_data = get_utf_encoded_file(zip.open(file_name), file_name) upload_to_s3(file_data)
内容的提问来源于stack exchange,提问作者SunainaDG
相关产品推荐
相关产品推荐

