使用 sys.stdin in python3 读取不同编码格式的文件
read files with different encoding format using sys.stdin in python3
我有很多文件是用 UTF-8 或 GBK 编码的。我的系统编码是UTF-8 (LANG=zh_CN.UTF-8
),所以我可以轻松读取UTF-8编码的文件。但我也必须阅读使用 GBK 编码的文件。我在此处关注 Python 3: How to specify stdin encoding:
import sys
import io
input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='gbk')
for line in input_stream:
print(line)
我的问题是如何从 sys.stdin
中安全地读取所有文件(GBK 和 UTF-8)。或者你能给我一些更好的解决方案吗?
为了稍微扩展一下这个问题,我想像这样处理文件:
cat *.in | python3 handler.py
*.in
returns 许多文件使用 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)。
您可以将输入读取为原始字节,然后检查输入以决定实际将其解码成什么。
另见 Reading binary data from stdin
假设您可以一次读取整行(即整行的编码可以预期是一致的),我会尝试解码为 utf-8,然后退回到 gbk。
for raw_line in input_stream:
try:
line = raw_line.decode('utf-8')
except UnicodeDecodeError:
line = raw_line.decode('gbk')
# ...
我有很多文件是用 UTF-8 或 GBK 编码的。我的系统编码是UTF-8 (LANG=zh_CN.UTF-8
),所以我可以轻松读取UTF-8编码的文件。但我也必须阅读使用 GBK 编码的文件。我在此处关注 Python 3: How to specify stdin encoding:
import sys
import io
input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='gbk')
for line in input_stream:
print(line)
我的问题是如何从 sys.stdin
中安全地读取所有文件(GBK 和 UTF-8)。或者你能给我一些更好的解决方案吗?
为了稍微扩展一下这个问题,我想像这样处理文件:
cat *.in | python3 handler.py
*.in
returns 许多文件使用 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)。
您可以将输入读取为原始字节,然后检查输入以决定实际将其解码成什么。
另见 Reading binary data from stdin
假设您可以一次读取整行(即整行的编码可以预期是一致的),我会尝试解码为 utf-8,然后退回到 gbk。
for raw_line in input_stream:
try:
line = raw_line.decode('utf-8')
except UnicodeDecodeError:
line = raw_line.decode('gbk')
# ...