Чтение файла из sys.stdin в режиме 'rb': Python - PullRequest
2 голосов
/ 12 марта 2020

Я написал ниже код для преобразования файла CSV в файл xml. Я читаю файл из sys.stdin и записываю вывод обратно в sys.stdout. При чтении файла появляется ошибка ниже.

UnicodeDecodeError: код 'utf-8' c не может декодировать байт 0x cc в позиции 7652: недопустимый байт продолжения

Я исследовал ошибку и обнаружил, что чтение входного файла в режиме 'rb' может устранить ошибку. Теперь, как мне изменить приведенный ниже код для чтения входного файла из sys.stdin в режиме 'rb'. Я не мог найти ответ еще.

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)

1 Ответ

1 голос
/ 18 марта 2020

В Python 3 и stdin, stout и stderr заключены в буферы ввода-вывода, которые применяются для кодирования / декодирования текста на лету к потокам.

Если вам нужен прямой доступ к базовому двоичному потоку, он доступен в качестве атрибутов в этих оболочках.

Для стандартного ввода, вместо вызова .read в sys.stdin do sys.stdin.buffer.raw.read() - (и аналогично для stderr и stdout, просто используйте ...buffer.raw, чтобы добраться до основной двоичный поток).

...