从';rb';模式:Python

从';rb';模式:Python,python,unicode,Python,Unicode,我已经编写了以下代码来将csv文件转换为xml文件。我正在从sys.stdin读取文件,并将输出写回sys.stdout。我在读取文件时遇到以下错误 UnicodeDecodeError:“utf-8”编解码器无法解码位置7652中的字节0xcc:无效的连续字节 我研究了这个错误,发现在“rb”模式下读取输入文件可以解决这个错误。现在,我如何更改下面的代码以在“rb”模式下从sys.stdin读取输入文件。我还没有找到答案 import csv import sys import os from

我已经编写了以下代码来将csv文件转换为xml文件。我正在从sys.stdin读取文件,并将输出写回sys.stdout。我在读取文件时遇到以下错误

UnicodeDecodeError:“utf-8”编解码器无法解码位置7652中的字节0xcc:无效的连续字节

我研究了这个错误,发现在“rb”模式下读取输入文件可以解决这个错误。现在,我如何更改下面的代码以在“rb”模式下从sys.stdin读取输入文件。我还没有找到答案

import csv
import sys
import os
from xml.dom.minidom import Document

filename = sys.argv[1]
filename = os.path.splitext(filename)[0]+'.xml'
pathname = "/tmp/"
output_file = pathname + filename

f = sys.stdin
reader = csv.reader(f)
fields = next(reader)
fields = [x.lower() for x in fields]
fieldsR = fields

doc = Document()
dataRoot = doc.createElement("rowset")
dataRoot.setAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance")
dataRoot.setAttribute('xsi:schemaLocation', "./schema.xsd")
doc.appendChild(dataRoot)

for line in reader:
    dataElt = doc.createElement("row")           
    for i in range(len(fieldsR)):
        dataElt.setAttribute(fieldsR[i], line[i])
        dataRoot.appendChild(dataElt)


xmlFile = open(output_file,'w')
xmlFile.write(doc.toprettyxml(indent = '\t'))
xmlFile.close()
sys.stdout.write(output_file)

在Python3中,stdin、stout和stderr都包装在IO缓冲区中,这些缓冲区对流应用即时文本编码/解码

如果您希望直接访问底层二进制流,则可以在这些包装器中将其作为属性使用

对于stdin,不要在
sys.stdin
do
sys.stdin.buffer.raw.read()中调用
.read
-
(同样,对于stderr和stdout,只需使用
…buffer.raw
即可访问底层二进制流)。

这是Python 2还是Python 3代码?如果是Python3,切换到二进制模式很容易,但也不是答案;
csv
模块需要
str
输入。它是Python 3。输入是通过sys.stdin的正常csv文件。它的数据是文本而不是二进制。你能详细说明一下如何用代码解决这个问题吗?问题不在于代码,而在于你的输入或你的语言环境。您的区域设置表示输入应为UTF-8;传递到
sys.stdin
的实际数据采用其他编码(无法从错误中得知;UNIX上的
文件
命令行实用程序可能会告诉您数据是否从磁盘上的文件通过管道传输)。语言环境编码和文件编码需要一致,这样原始字节就可以解码为它们应该表示的逻辑文本。