MST

星途 面试题库

面试题:Python多编码文件写入场景处理

假设你有一个需求,要将不同编码格式(如UTF - 8、GBK)的数据写入到同一个文件中,并且确保文件最终的编码格式是UTF - 16。请用Python代码实现该功能,并解释每一步的原理及可能遇到的编码转换陷阱。
24.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Python代码实现

import codecs


def write_encoded_data_to_utf16(file_path, data_list, encoding_list):
    with codecs.open(file_path, 'w', 'utf - 16') as f:
        for data, encoding in zip(data_list, encoding_list):
            try:
                decoded_data = data.decode(encoding)
                f.write(decoded_data)
            except UnicodeDecodeError as e:
                print(f"解码 {encoding} 格式数据时出错: {e}")


使用示例:

data1 = b'\xe4\xb8\xad'  # UTF - 8编码的“中”
data2 = b'\xd6\xd0'  # GBK编码的“中”
data_list = [data1, data2]
encoding_list = ['utf - 8', 'GBK']
write_encoded_data_to_utf16('output.txt', data_list, encoding_list)

原理解释

  1. 打开文件
    • 使用codecs.open(file_path, 'w', 'utf - 16')以UTF - 16编码打开文件。codecs模块提供了方便处理不同编码的文件I/O操作。'w'表示写入模式,如果文件不存在则创建,如果存在则覆盖。
  2. 遍历数据和编码列表
    • 使用zip(data_list, encoding_list)将数据列表和对应的编码列表组合在一起,以便同时遍历。
  3. 解码数据
    • decoded_data = data.decode(encoding)尝试将字节数据data按照指定的encoding进行解码。例如,如果数据是UTF - 8编码的,就使用'utf - 8'编码进行解码;如果是GBK编码的,就使用'GBK'编码进行解码。解码后的数据是Unicode字符串。
  4. 写入文件
    • f.write(decoded_data)将解码后的Unicode字符串写入到以UTF - 16编码打开的文件中。由于文件已经以UTF - 16编码打开,Python会自动将Unicode字符串编码为UTF - 16格式写入文件。

编码转换陷阱

  1. 解码错误
    • 如果使用错误的编码格式进行解码,会抛出UnicodeDecodeError。例如,用'utf - 8'解码GBK编码的数据。在代码中,通过try - except块捕获并打印错误信息。
  2. 隐式编码转换
    • 在Python中,不同编码之间的转换应该显式进行。如果不小心在未解码的字节数据上进行操作,可能会导致数据损坏或编码错误。例如,直接将字节数据写入期望Unicode字符串的文件对象中。
  3. 字节序问题
    • UTF - 16有大端序(UTF - 16BE)和小端序(UTF - 16LE)。codecs.open默认使用系统相关的字节序。如果需要特定字节序,需要明确指定,例如'utf - 16be''utf - 16le'