Замена потоковой строки Python3

#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 помощью . Секундочку, это станет еще проще 🙂