使用python3中的sys.stdin读取不同编码格式的文件

时间:2018-01-15 06:30:13

标签: python python-3.x encoding utf-8 gbk

我有很多文件(用utf8或gbk编码)。我的系统编码是utf-8(LANT = zh_CN.UTF-8),所以我可以轻松读取使用utf8编码的文件。但我必须使用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和utf8)。或者你能给我一些更好的解决方案吗?感谢〜

---------------------之前我的问题不明确,我会添加更多信息-------------- --------

简而言之,我想处理这样的文件:

cat *.in | python3 handler.py

* .in中提供了许多用utf8或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

遇到utf8文件时,会抛出错误:

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

我想找到一种安全的方法来处理文件的类型(utf8和gbk)。谢谢你的帮助

---------------------------问题解决了------------------ ---------------

感谢@tripleee和其他人的帮助!我终于使用以下代码解决了我的问题。

buffer_reader = sys.stdin.buffer
for line in buffer_reader:
    line = line.strip()
    try:
        content = line.decode('utf-8')
    except UnicodeDecodeError:
        content = line.decode('gbk')

1 个答案:

答案 0 :(得分:1)

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

另见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')
    # ...