[英]Read file from sys.stdin in 'rb' mode : Python
我寫了下面的代碼來將 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)
在 Python 3 中,stdin、stout 和 stderr 都封裝在 IO 緩沖區中,這些緩沖區將動態文本編碼/解碼應用於流。
如果您想直接訪問底層二進制流,它可以作為這些包裝器中的屬性使用。
對於標准輸入,不要在sys.stdin
中調用.read
做sys.stdin.buffer.raw.read()
- (同樣對於標准輸入和標准輸出,只需使用...buffer.raw
來獲取底層二進制流)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.