簡體   English   中英

以“rb”模式從 sys.stdin 讀取文件:Python

[英]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中調用.readsys.stdin.buffer.raw.read() - (同樣對於標准輸入和標准輸出,只需使用...buffer.raw來獲取底層二進制流)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM