[英]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,则以下方法可能有效:
b'\xef\xbb\xbf'
那么编码极有可能是 'utf-8-sig',UTF-8 的 Microsoft 变体(除非你有合法以“'ï»开头的 cp1252 文件¿'”)。 请参阅编解码器文档这一部分的最后一段。UnicodeDecodeError
。UnicodeDecodeError
并用 cp1252 再试一次。所以 - 问题是 - 如果现有文件已经是 UTF8 如何处理这种情况,所以要么将其读取为 UTF8,要么更好地避免上述整个处理过程。
UTF8 比 CP1252 更受限制,并且两者都是 ascii 兼容的。 因此,您可以先将其作为 UTF8 读取,如果它可以正常工作(它是纯 ASCII 或有效的 UTF-8),如果它不退回到 CP1252。
或者,您可以尝试在其上运行chardet
,但这不一定更可靠:每个字节在 ISO-8859 编码中都是“有效的”(CP1252 是它的衍生物),因此每个文件都“正确解码”,它们只是返回垃圾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.