Convertir el flujo de entrada binario al modo de texto

Estoy intentando leer un archivo CSV comprimido con bzip2 en Python 3.2. Para un archivo CSV sin comprimir, esto funciona:

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

El problema es que BZ2File solo admite la creación de un flujo binario , y en Python 3, csv.reader solo acepta flujos de texto . (El mismo problema ocurre con los archivos gzip y zip.)

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

En particular, la línea indicada lanza la excepción _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) .

También probé data = csv.reader(codecs.EncodedFile(datafile, 'utf8')) , pero eso no corrige el error.

¿Cómo puedo ajustar el flujo de entrada binario para que se pueda utilizar en modo de texto?

Esto funciona para mí:

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

En el caso de 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)