1

我有许多用 UTF-8 或 GBK 编码的文件。我的系统编码是 UTF-8 ( LANG=zh_CN.UTF-8),因此我可以轻松读取使用 UTF-8 编码的文件。但我也必须使用 GBK 读取文件编码。我正在关注Python 3:如何在此处指定标准输入编码:

import sys 
import io
input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='gbk')
for line in input_stream:
    print(line)

我的问题是如何从 sys.stdin. 或者你能给我一些更好的解决方案吗?

为了稍微扩展这个问题,我想处理这样的文件:

cat *.in | python3 handler.py

*.in返回许多使用 UTF-8 或 GBK 编码的文件。

如果我在handler.py

for line in sys.stdin:
    ...some code

它会在尝试处理 GBK 文件时立即抛出错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte

另一方面,如果我使用这样的代码:

input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='gbk')
for line in input_stream:
    ...some code

它会在任何 UTF-8 文件上引发错误:

UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 25: illegal multibyte sequence

我想找到一种安全的方法来处理我的脚本中的两种类型的文件(UTF-8 和 GBK)。

4

1 回答 1

2

您可以将输入读取为原始字节,然后检查输入以决定将其实际解码为什么。

另请参阅从标准输入读取二进制数据

假设您可以一次读取整行(即整行的编码可以预期是一致的),我会尝试解码为 utf-8,然后回退到 gbk。

for raw_line in input_stream:
    try:
        line = raw_line.decode('utf-8')
    except UnicodeDecodeError:
        line = raw_line.decode('gbk')
    # ...
于 2018-01-15T09:09:55.587 回答