#python #csv #stringio
Вопрос:
У меня есть python3 «файлоподобный объект», read()
метод которого возвращает строку-она исходит либо из открытого файла, либо из объекта, переданного с s3
помощью boto3
.
Я хочу очистить поток перед его передачей csv.DictReader
, в частности, потому, что этот модуль выблевывает NUL
символы на входе.
Файлы CSV, которые я обрабатываю, могут быть большими, поэтому я хочу выполнить эту «потоковую передачу», а не считывать весь файл/объект в память.
Как мне обернуть объект ввода, чтобы я мог очистить каждую строку read()
, возвращенную с помощью вызова, например: .replace('x00', '{NUL}')
?
Я думаю, что io
библиотека — это то , что нужно искать, но я не мог найти что-то, что, очевидно, делало то, что я хочу, — чтобы иметь возможность перехватывать и преобразовывать каждый вызов .read()
в базовый файлоподобный объект и передавать оболочку csv
, не читая все сразу.
Ответ №1:
Вы можете использовать простую функцию генератора, которая фиксирует данные перед их передачей csv.reader
:
import io import csv def denull(line_gen): for line in line_gen: yield line.replace('x00', '{NUL}') data = io.StringIO(""" hello;world asdf;hx00pla """.strip()) for row in csv.reader(denull(data), delimiter=";"): print(row)
распечатки
['hello', 'world'] ['asdf', 'h{NUL}pla']
Комментарии:
1. Я получаю
object is not iterable
— мне, наверноеcsv.DictReader
, нуженIterable[str]
объект — как мне этого добиться?2. Ах да, только что попробовал это с
csv
помощью . Секундочку, это станет еще проще 🙂