在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS 中从 Lambda 启动 shell 脚本

在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝

在 AWS Lambda 函数中从 S3 获取对象并发送到 Api Gateway

试图在AWS Lambda上运行python脚本,但是如果加载virtualenv目录,Lambda会失败

使用 AWS CDK 在 AWS Codepipeline 中部署 Python Lambda 函数

Lambda,AWS和Python的自动化管理操作