Écrit en Python intégré .csv module
[S'il vous plaît noter que ce est une question différente de la déjà répondu Comment remplacer une colonne à l'aide de Python intégré .csv écrivain module?]
J'ai besoin de faire un rechercher et remplacer (spécifique à une colonne d'Url) dans un énorme Excel .fichier csv. Depuis que je suis dans les premiers stades d'essayer de m'enseigner un langage de script, j'ai pensé que je voudrais essayer de mettre en œuvre la solution en python.
J'ai du mal quand j'essaie d'écrire de nouveau à un .fichier csv après avoir modifié le contenu de l'entrée. J'ai lu le officiel csv documentation du module sur la façon d'utiliser l'écrivain, mais il n'y a pas un exemple qui couvre ce cas. Plus précisément, je vais essayer d'aller le lire, de le remplacer, et les opérations d'écriture accompli en une seule boucle. Cependant, on ne peut pas utiliser la même "ligne" référence à la fois pour la boucle de l'argument et que le paramètre de l'écrivain.writerow(). Donc, une fois que j'ai fait le changement dans la boucle for, comment dois-je écrire dans le fichier?
edit: j'ai mis en œuvre les suggestions de S. Lott et Jimmy, toujours le même résultat
edit #2: j'ai ajouté le "rb" et "wb" pour l'ouvrir() fonctions, par S. Lott suggestion du
import csv
#filename = 'C:/Documents and Settings/username/My Documents/PALTemplateData.xls'
csvfile = open("PALTemplateData.csv","rb")
csvout = open("PALTemplateDataOUT.csv","wb")
reader = csv.reader(csvfile)
writer = csv.writer(csvout)
changed = 0;
for row in reader:
row[-1] = row[-1].replace('/?', '?')
writer.writerow(row) #this is the line that's causing issues
changed=changed+1
print('Total URLs changed:', changed)
edit: Pour votre référence, c'est le nouveau plein de retraçage de l'interprète:
Traceback (most recent call last):
File "C:\Documents and Settings\g41092\My Documents\palScript.py", line 13, in <module>
for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
OriginalL'auteur ignorantslut | 2009-06-19
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas lire et écrire le même fichier.
L'approche normale de TOUS les fichiers de la manipulation est de créer une COPIE modifiée du fichier d'origine. N'essayez pas de mettre à jour les fichiers en place. C'est juste un mauvais plan.
Modifier
Dans les lignes
Le "rb" et "wb" sont absolument nécessaires. Chaque fois que vous l'ignorez, vous ouvrez le fichier pour le lire dans le mauvais format.
Vous devez utiliser "rb" pour lire un .Fichier CSV. Il n'y a pas le choix avec Python 2.x. Avec Python 3.x, vous pouvez omettre cette, mais l'utilisation de "r" explicitement pour le rendre clair.
Vous devez utiliser "wb" pour écrire une .Fichier CSV. Il n'y a pas le choix avec Python 2.x. Avec Python 3.x, vous devez utiliser le "w".
Modifier
Il semble que vous utilisez Python3. Vous aurez besoin d'enlever le "b" de "rb" et "wb".
Lire ceci: http://docs.python.org/3.0/library/functions.html#open
Maintenant que j'y pense, mais, avant, j'ai tenté d'écrire dans le fichier (c'est à dire, quand j'étais encore en train de trouver la colonne de droite dans le .csv), le script fonctionne très bien sans le rb.
"Le "rb" et "wb" sont absolument nécessaires.": pas en Python 3. Là, vous devez appeler open() avec retour à la ligne=".
Retrait de la " b " de "rb" et "wb" a fait le tour... Merci à vous tous!
Les commentaires sont sympa, mais Accepter la Réponse est la façon dont fonctionne.
OriginalL'auteur S.Lott
Ouverture des fichiers csv en tant que binaire est tout simplement faux. CSV sont de simples fichiers textes, donc Vous devez les ouvrir avec
L'erreur
vient du fait que Vous êtes de les ouvrir en mode binaire.
Quand j'étais ouverture d'excel csv avec python, j'ai utilisé quelque chose comme:
et cela a fonctionné assez rapide (j'ai été l'ouverture de deux environ 10 mo chacun des fichiers csv, mais je l'ai fait avec la version 2.6 de python, pas de la version 3.0).
Il y a quelques modules de travail pour travailler avec excel csv fichiers à partir de python - pyExcelerator est l'un d'entre eux.
John, je suis pour à 100% sûr, que lorsque je travaillais avec des fichiers csv avec python 2.6, j'ai ouvert dans le texte, et non pas en mode binaire. J'ai ouvert essayé d'ouvrir un compte en python 2.6.2 - il a travaillé comme un charme. L'anglais est ma deuxième langue, donc mes posts / commentaires généralement sains, comme ils ont été écrits par bu teenanger. Ce que je voulais dire avec pyExcelerator, c'est qu'il y a quelques modules conçus spécifiquement pour travailler avec des fichiers csv - je n'ai pas écrit, que ce modules sont inclus dans la distribution standard. Cheers Mate.
(1) 2.x ouverture en mode texte ne fonctionnera pas correctement si il y a des retours à la ligne intégré à vos données. Le manuel dit de l'ouvrir en mode binaire. Juste faire il! (2) pyExcelerator ni lit ni n'écrit fichiers csv; encore une fois je pose la question: Quelle est la pertinence de pyExcelerator???
OriginalL'auteur zeroDivisible
le problème, c'est que vous tentez d'écrire dans le même fichier que vous êtes en train de lire. écrire dans un autre fichier, puis de le renommer après la suppression de l'original.
OriginalL'auteur Jimmy