如何读取 sys.stdin
,但忽略解码错误?
我知道存在 sys.stdin.buffer
,我可以读取二进制数据,然后使用 .decode('utf8', errors='ignore')
进行解码,但我想逐行读取 sys.stdin
。
也许我可以以 errors='ignore'
选项重新打开 sys.stdin
文件?
如Mark Setchell所提到的,从这里找到了三种解决方案。
import sys
import io
def first():
with open(sys.stdin.fileno(), 'r', errors='ignore') as f:
return f.read()
def second():
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, errors='ignore')
return sys.stdin.read()
def third():
sys.stdin.reconfigure(errors='ignore')
return sys.stdin.read()
print(first())
#print(second())
#print(third())
使用方法:
$ echo 'a\x80b' | python solution.py
ab
您可以在PYTHONIOENCODING环境变量上设置错误处理程序选项:这将影响sys.stdin
和sys.stdout
(sys.stderr
始终使用“backslashreplace”)。PYTHONIOENCODING
接受可选的编码名称和可选的错误处理程序名称,前面加上冒号,因此“UTF8”,“UTF8:ignore”和“:ignore”都是有效值。
$ cat so73335410.py
import sys
if __name__ == '__main__':
data = sys.stdin.read()
print(data)
$
$ echo hello | python so73335410.py
hello
$ echo hello hello hello hello | zip > hello.zip
adding: - (deflated 54%)
$
$ cat hello.zip | PYTHONIOENCODING=UTF8:ignore python so73335410.py
UYv>
-▒
UY HW@'PKv>
▒-PK,-/>PKmPK/>
$
sys.stdin.read()
,或者更具体地说,是for line in sys.stdin
,但它会抛出UnicodeDecodeError。如果我捕获了它,我该如何读取这一行呢?我只需要忽略它无法读取的符号。这一行大多数情况下包含ASCII字符,但也可能包含ASCII之外的字符,所以我需要忽略它们或用“?”替换。 - g00ddsbytes.decode
函数忽略我无法解码的数据。如果我像open(filename,'r',errors ='ignore')
一样读取实际文件,我可以做到这一点,但我想读取sys.stdin
,但它已经是一个打开的文件描述符,所以我不知道如何设置errors ='ignore'
选项。 - g00ddssys.stdin.buffer
гҖӮ - Keith