繁体   English   中英

Python - 在读取时推断输入文件编码

[英]Python - inferring input file encoding while reading

我必须处理一个输入文本文件,它可以是 ANSI 格式并将其转换为 UTF8,同时对读取的行进行一些处理。 在 python 中,这相当于

with open(input_file_location, 'r', newline='\r\n', encoding='cp1252') as old, open(output_file_location, 'w', encoding='utf_8') as new:
  for line in old:
    modified = ... do processing here ....
    new.write(modified)

但是,只有当输入文件是 ANSI (windows) 时,这才会按预期工作。 但是,如果输入文件最初是 UTF8,则上面的代码会静默运行,假设 ANSI 读取它,因此输出的内容与预期不同。

所以 - 问题是 - 如果现有文件已经是 UTF8 如何处理这种情况,所以要么将其读取为 UTF8,要么更好地避免上述整个处理过程。

谢谢

如果事先不知道,则无法保证确定文件编码的方法。 但是,如果您确定可能性仅限于 UTF-8 和 cp1252,则以下方法可能有效:

  1. 以二进制模式打开文件并读取前三个字节。 如果这些字节是b'\xef\xbb\xbf'那么编码极有可能是 'utf-8-sig',UTF-8 的 Microsoft 变体(除非你有合法以“'ï»开头的 cp1252 文件¿'”)。 请参阅编解码器文档这一部分的最后一段。
  2. 假设为 UTF-8。 UTF-8 和 cp1252 都将对 ASCII 范围 (0-127) 中的字节进行相同的解码。 设置了高位的单个字节不是有效的 UTF-8,因此如果文件编码为 cp1252 并包含此类字节,则会引发UnicodeDecodeError
  3. 捕获上面的UnicodeDecodeError并用 cp1252 再试一次。

所以 - 问题是 - 如果现有文件已经是 UTF8 如何处理这种情况,所以要么将其读取为 UTF8,要么更好地避免上述整个处理过程。

UTF8 比 CP1252 更受限制,并且两者都是 ascii 兼容的。 因此,您可以先将其作为 UTF8 读取,如果它可以正常工作(它是纯 ASCII 或有效的 UTF-8),如果它不退回到 CP1252。

或者,您可以尝试在其上运行chardet ,但这不一定更可靠:每个字节在 ISO-8859 编码中都是“有效的”(CP1252 是它的衍生物),因此每个文件都“正确解码”,它们只是返回垃圾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM