2010-06-08 5 views
2

J'ai plusieurs fichiers CSV que j'ai besoin d'analyser en boucle pour collecter des informations. Le problème est que, bien qu'ils aient le même format, certains sont délimités par '\ t' et d'autres par ','. Après cela, je veux supprimer le guillemet double autour de la chaîne.Python: fichiers fractionnés à l'aide de séparateurs à plusieurs blocs

Est-ce que python peut être divisé via plusieurs délimiteurs possibles?

A la minute, je peux diviser la ligne avec un en utilisant:

f = open(filename, "r") 
fields = f.readlines() 
for fs in fields: 
    sf = fs.split('\t') 
    tf = [fi.strip ('"') for fi in sf] 

Toutes les suggestions sont les bienvenus.

+0

double possible de [Python regex découper une chaîne par l'un des deux délimiteurs] (http://stackoverflow.com/questions/618551/python-regex-split-a-string-by-one-of- deux-délimiteurs) – danben

+2

S'il vous plaît ne pas fermer cela comme doublon: Comme je le dis dans ma réponse, diviser manuellement est la mauvaise solution ici, donc l'autre question ne sera pas utile. – interjay

Répondre

14

Diviser le fichier comme ça n'est pas une bonne idée: il échouera s'il y a une virgule dans l'un des champs. Par exemple (pour un fichier délimité par des tabulations): La ligne "field1"\t"Hello, world"\t"field3" sera divisée en 4 champs au lieu de 3.

Au lieu de cela, vous devez utiliser le module csv. Il contient la classe utile Sniffer qui peut détecter les délimiteurs utilisés dans le fichier. Le module csv supprimera également les doubles quotes pour vous.

import csv 

csvfile = open("example.csv") 
dialect = csv.Sniffer().sniff(csvfile.read(1024)) 
csvfile.seek(0) 
reader = csv.reader(csvfile, dialect) 

for line in reader: 
    #process line 
+0

+1 En python, vous trouverez généralement quelques outils qui peuvent vous aider avec votre problème tant que vous travaillez avec un format familier. Une leçon apprise de nombreuses tentatives avortées de réinventer la roue :) – daramarak

+0

À quoi fait référence 1024? – user809695

+0

@ user809695 Cela signifie de déterminer le format basé sur les 1024 premiers octets du fichier. Il peut s'agir de n'importe quel autre numéro, il doit juste être suffisamment grand pour contenir suffisamment de données pour déterminer le format. – interjay

2

Vous pouvez le faire avec regex (en option compilé):

sf = re.split(r'[,\t]', fs) 

Cela ne tient pas compte par exemple des virgules à l'intérieur des champs délimités par des tabulations. Je verrais si le module csv est utile.

Questions connexes