Question

[Veuillez noter qu'il s'agit d'une question différente de celle déjà répondue Comment remplacer une colonne à l'aide du module d'écriture .csv intégré à Python? ]

Je dois effectuer une recherche et un remplacement (spécifiques à une colonne d'URL) dans un énorme fichier Excel .csv. Étant donné que je commence à peine à m'apprendre à utiliser un langage de script, je me suis dit que j'essaierais de mettre en œuvre la solution en python.

Je ne parviens pas à réécrire dans un fichier .csv après avoir modifié le contenu d'une entrée. J'ai lu la documentation officielle du module csv sur l'utilisation de l'écrivain, mais il n'y a pas d'exemple qui couvre ce cas. Plus précisément, j'essaie d'obtenir les opérations de lecture, de remplacement et d'écriture en une seule boucle. Cependant, on ne peut pas utiliser la même référence de "ligne" dans les arguments de la boucle for et comme paramètre pour writer.writerow (). Alors, une fois que j'ai fait le changement dans la boucle for, comment dois-je écrire dans le fichier?

modifier: j'ai appliqué les suggestions de S. Lott et Jimmy, toujours le même résultat

modifier n ° 2: j'ai ajouté le " rb " et & wb & wb " aux fonctions open (), selon la suggestion de S. Lott

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)

modifier: Pour votre information, il s'agit du nouveau relevé complet de l'interpréteur:

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?)
Était-ce utile?

La solution

Vous ne pouvez pas lire et écrire le même fichier.

source = open("PALTemplateData.csv","rb")
reader = csv.reader(source , dialect)

target = open("AnotherFile.csv","wb")
writer = csv.writer(target , dialect)

L’approche normale de la manipulation de tous les fichiers consiste à créer une copie modifiée du fichier original. N'essayez pas de mettre à jour les fichiers en place. C'est juste un mauvais plan.

Modifier

Dans les lignes

source = open("PALTemplateData.csv","rb")

target = open("AnotherFile.csv","wb")

Le " rb " et & wb & wb " sont absolument nécessaires. Chaque fois que vous les ignorez, vous ouvrez le fichier pour le lire au mauvais format.

Vous devez utiliser " rb " lire un fichier .CSV. Il n'y a pas de choix avec Python 2.x. Avec Python 3.x, vous pouvez l'omettre, mais utilisez "r". explicitement pour le rendre clair.

Vous devez utiliser " wb " écrire un fichier .CSV. Il n'y a pas de choix avec Python 2.x. Avec Python 3.x, vous devez utiliser "w".

Modifier

Il semble que vous utilisiez Python3. Vous devrez laisser tomber le " b " de " rb " et "wb".

Lisez ceci: http://docs.python.org/3.0/ library / functions.html # open

Autres conseils

Ouvrir des fichiers csv en binaire est tout simplement faux. Les fichiers CSV sont des fichiers texte normaux, vous devez donc les ouvrir avec

source = open("PALTemplateData.csv","r")
target = open("AnotherFile.csv","w")

L'erreur

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

vient parce que vous les ouvrez en mode binaire.

Lorsque j'ai ouvert Excel CSV avec Python, j'ai utilisé quelque chose du genre:

try:    # checking if file exists
    f = csv.reader(open(filepath, "r", encoding="cp1250"), delimiter=";", quotechar='"')
except IOError:
    f = []

for record in f:
    # do something with record

et cela a fonctionné assez rapidement (j’ouvrais deux fichiers csv de 10 Mo chacun, bien que je l’ai fait avec python 2.6, pas avec la version 3.0).

Il existe peu de modules de travail permettant de travailler avec des fichiers csv Excel à partir de python - pyExcelerator en est un. eux.

le problème est que vous essayez d'écrire dans le même fichier que celui que vous lisez. écrivez dans un autre fichier puis renommez-le après avoir supprimé l'original.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top