You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:39:02