2015-09-23 6 views
-2

Je suis en train d'écrire des listes comme celle-ci dans un fichier CSV:Python: Même après delimiter spécification, écrivain csv délimite au mauvais endroit

['ABC','One,Two','12'] 
['DSE','Five,Two','52'] 

Pour un fichier comme ceci:

ABC One,Two 12 
DSE Five,Two 52 

Fondamentalement, écrire quelque chose à l'intérieur d'une cellule. Cependant, il divise One et Two en différentes cellules et fusionne ABC avec One dans la première cellule.

Une partie de mon script:

out_file_handle = open(output_path, "ab") 
writer = csv.writer(out_file_handle, delimiter = "\t", dialect='excel', lineterminator='\n', quoting=csv.QUOTE_NONE)  
output_final = (tsv_name_list.split(".")[0]+"\t"+key + "\t" + str(listOfThings)) 
output_final = str([output_final]).replace("[","").replace("]","").replace('"',"").replace("'","") 
output_final = output_final.split("\\t") 
print output_final #gives the first lists of strings I mentioned above. 
writer.writerow(output_final) 

Première ligne output_final donne

ABC One,Two 12 
DSE Five,Two 52 
+0

@StevenRumbalski Oui. Mais le fichier csv a ABC \ tOne dans une cellule, Two \ t12 dans une autre cellule, ce qui n'est pas ce que j'essaie d'écrire. – pam

Répondre

2

En utilisant le module csv fonctionne simplement, vous allez avoir besoin d'être plus précis sur ce qui vous convaincre que les éléments saignent à travers les cellules. Par exemple, en utilisant le (maintenant tout à fait obsolète) Python 2.7:

import csv 

data_lists = [['ABC','One,Two','12'], 
       ['DSE','Five,Two','52']] 

with open("out.tsv", "wb") as fp: 
    writer = csv.writer(fp, delimiter="\t", dialect="excel", lineterminator="\n") 
    writer.writerows(data_lists) 

je reçois un fichier out.tsv de:

[email protected]:~/coding$ more out.tsv 
ABC One,Two 12 
DSE Five,Two 52 

ou

>>> out = open("out.tsv").readlines() 
>>> for row in out: print repr(row) 
... 
'ABC\tOne,Two\t12\n' 
'DSE\tFive,Two\t52\n' 

qui est exactement comme il devrait être. Maintenant, si vous prenez ces lignes, qui sont délimitées par des tabulations, et pour une raison quelconque les diviser en utilisant les virgules comme délimiteur, bien sûr, vous penserez qu'il y a deux colonnes, une avec ABC\tOne et une avec Two\t12. Mais ce serait idiot.

+0

Merci pour votre réponse. Que puis-je faire si je veux un fichier .csv au lieu de .tsv avec un délimiteur d'onglet? – pam

+0

@pam: ne pas définir 'delimiter =" \ t "', qui lui demande d'utiliser une tabulation comme délimiteur. :-) Notez que si vous faites cela, vous voudrez supprimer votre 'quoting = csv.QUOTE_NONE', car si vous voulez utiliser des virgules comme délimiteurs mais aussi des virgules dans les valeurs, vous devrez vous assurer qu'il les citations automatiquement afin que vous puissiez le diviser correctement plus tard. – DSM

0

Vous avez mis en place l'écrivain CSV, mais pour une raison quelconque vous ignorer complètement et essayer de sortir le lignes manuellement. C'est inutile. Utilisez la fonctionnalité disponible.

writer = csv.writer(...) 
for row in tsv_list: 
    writer.writerow(row) 
+0

Merci pour la réponse! Il dit 'AttributeError: l'objet '_csv.writer' n'a pas d'attribut 'write''. Quand je fais writer.writerow, il donne ABC \ tOne dans une cellule, Two \ t12 dans une autre. – pam

+0

Je ne suis pas sûr de ce que vous entendez par "cellule" cependant. Êtes-vous en train d'importer dans Excel mais en utilisant un format délimité par des virgules plutôt qu'un format délimité par des tabulations? –