2014-05-20 1 views
0

alors j'écris du code qui doit extraire la configuration/données à partir de fichiers CSV, qui sont empaquetés avec l'application. D'après ce que je comprends en utilisant pkgutil est le «bon» moyen de le faire. Donc ce que je suis en train de faire est:Lire un fichier csv (texte) avec pkgutil.get_data

import pkgutil 
MatFile = pkgutil.get_data('impy.implosions', 'LILAC_Materials.csv') 

qui fonctionne très bien et me donne l'octets du fichier. Mais je ne peux pas comprendre comment le faire en csv.reader d'une manière propre. J'ai trouvé ce old question mais sa solution serait quelque chose comme:

MatFile = io.StringIO(MatFile) 
dataReader = csv.reader(MatFile , delimiter=',') 

qui ne fonctionne pas depuis StringIO attend à une str. La fonctionnalité complémentaire dans io serait BytesIO, mais cela ne m'aide pas puisque csv.reader ne peut pas le gérer. Il semble que cela devrait avoir une solution simple, mais je ne suis pas familier avec la manipulation des données d'octets en python. Merci!

Répondre

2

En Python 3, les classes du module csv s'attendent à ce que vous leur transmettiez un itératif qui génère des chaînes Unicode. Si vous avez vos données sous forme de chaînes à un seul octet, vous devez d'abord décoder les données, puis les diviser en lignes.

est ici un peu rapide de code qui devrait fonctionner:

MatFile = pkgutil.get_data('impy.implosions', 'LILAC_Materials.csv') 
dataReader = csv.reader(MatFile.decode('utf-8').splitlines(), delimiter=',') 

Je devine que le fichier a été encodée avec UTF-8 (ou ASCII, qui est un sous-ensemble). Si vous savez autrement échanger le codage approprié dans l'appel decode. str.splitlines prend soin de diviser la chaîne unique en une liste de lignes, ce qui est parfaitement acceptable comme entrée pour csv.reader.

+0

Merci! Savait que ce serait simple ... –