Как использовать csv.DictReader для объекта tarfile в Python 3.6?

Вот проблема, с которой я сталкиваюсь:

Error: iterator should return strings, not bytes (did you open the file in text mode?)

Код, который вызывает это, выглядит примерно так:

for fileinfo in tarfile.open(filename):
    f = t.extractfile(fileinfo)
    reader = csv.DictReader(f)
    reader.fieldnames

Беда в том, что extractfile() Метод создает io.BufferedReader, который является очень простым файловым объектом и не имеет высокоуровневого текстового интерфейса.

Что было бы хорошим способом справиться с этим?

Я думаю о том, чтобы посмотреть, как расшифровать байты из читателя в текст, но мне нужно сохранить потоковую передачу, потому что эти файлы очень большие. Кодовой базой является Python 3.6, работающий в Docker/Linux.

1 ответ

Спасибо и @Aran-Fey, и @zwer, которые привели меня к другому вопросу Stackru, который ответил на него. Вот как:

for fileinfo in tarfile.open(filename):
    with t.extractfile(fileinfo) as f:
        ft = codecs.getreader("utf-8")(f)
        reader = csv.DictReader(ft)
        reader.fieldnames

Кажется, это работает до сих пор.

Другие вопросы по тегам