Преобразовать двоичный поток ввода в текстовый режим

Я пытаюсь прочитать сжатый bzip2 CSV-файл в Python 3.2. Для несжатого CSV-файла это работает:

<code>datafile = open('./file.csv', mode='rt')
data = csv.reader(datafile)
for e in data:    # works
    process(e)
</code>

Проблема в том, чтоBZ2File only supports creating a binary streamи в Python 3,csv.reader accepts only text streams, (Та же проблема возникает с файлами gzip и zip.)

<code>datafile = bz2.BZ2File('./file.csv.bz2', mode='r')
data = csv.reader(datafile)
for e in data:    # error
    process(e)
</code>

В частности, указанная строка выдает исключение_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?).

Я также пыталсяdata = csv.reader(codecs.EncodedFile(datafile, 'utf8')), но это не исправляет ошибку.

Как я могу обернуть поток двоичного ввода, чтобы он мог использоваться в текстовом режиме?

Ответы на вопрос(1)

Решение Вопроса

import codecs, csv
f = codecs.open("file.csv", "r", "utf-8")
g = csv.reader(f)
for e in g:
    print(e)

В случае с BZ2:

import codecs, csv, bz2
f = bz2.BZ2File("./file.csv.bz2", mode="r")
c = codecs.iterdecode(f, "utf-8")
g = csv.reader(c)
for e in g:
    print(e)
 09 мая 2012 г., 06:27
Отредактировано, спасибо!
 09 мая 2012 г., 06:23
И как именно вы намеревались использовать это с bz2-сжатым файлом?
 09 мая 2012 г., 08:45
@ vz0: последняя деталь, которая должна быть проверена, - это если интерпретация новых строк работает так, как ожидалось (т.е. не интерпретация). Другими словами, если последовательности новой строки могут содержаться внутри указанных значений, несжатый CSV будет использоватьopen(fname, 'r', newlines=''), Вероятно, это работает правильно. Ты можешь попробовать?

Ваш ответ на вопрос