Pergunta

Observe que esta é uma pergunta diferente da já respondida Como substituir uma coluna usando o módulo Writer .CSV do Python?]

Preciso fazer uma localização e substituição (específica para uma coluna de URLs) em um enorme arquivo do Excel .csv. Como estou nos estágios iniciais de tentar me ensinar uma linguagem de script, imaginei que tentaria implementar a solução no Python.

Estou tendo problemas quando tento escrever de volta para um arquivo .csv depois de fazer uma alteração no conteúdo de uma entrada. Eu li o documentação oficial do módulo CSV sobre como usar o escritor, mas não há um exemplo que cubra este caso. Especificamente, estou tentando obter as operações de leitura, substituição e gravação realizadas em um loop. No entanto, não se pode usar a mesma referência 'linha' no argumento do loop e como o parâmetro para writer.writerow (). Então, depois de fazer a alteração no loop for, como devo escrever de volta no arquivo?

editar: Eu implementei as sugestões de S. Lott e Jimmy, ainda o mesmo resultado

Editar #2: Eu adicionei o "RB" e o "WB" às funções Open (), por sugestão 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)

editar: Para sua referência, este é o novo Traceback completo do intérprete:

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?)
Foi útil?

Solução

Você não pode ler e escrever o mesmo arquivo.

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

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

A abordagem normal para toda a manipulação de arquivos é criar uma cópia modificada do arquivo original. Não tente atualizar os arquivos no lugar. É apenas um plano ruim.


Editar

Nas linhas

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

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

O "RB" e o "WB" são absolutamente necessários. Toda vez que você os ignora, você abre o arquivo para ler no formato errado.

Você deve usar "RB" para ler um arquivo .csv. Não há escolha com Python 2.x. Com o Python 3.x, você pode omitir isso, mas use "R" explicitamente para deixá -lo claro.

Você deve usar "WB" para gravar um arquivo .csv. Não há escolha com Python 2.x. Com o Python 3.x, você deve usar "W".


Editar

Parece que você está usando o Python3. Você precisará abandonar o "B" de "RB" e "WB".

Leia isso: http://docs.python.org/3.0/library/functions.html#open

Outras dicas

Abrir arquivos CSV como binário está errado. CSV são arquivos de texto normais, para que você precise abri -los com

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

O erro

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

Vem porque você os está abrindo no modo binário.

Quando eu estava abrindo o Excel CSV's com Python, usei algo como:

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

E funcionou bastante rápido (eu estava abrindo dois arquivos de cerca de 10 MB cada CSV, embora eu tenha feito isso com o Python 2.6, não a versão 3.0).

Existem poucos módulos de trabalho para trabalhar com arquivos CSV do Excel de dentro do Python - Pyexcelerator é um deles.

O problema é que você está tentando escrever para o mesmo arquivo que está lendo. Escreva para um arquivo diferente e renomeie -o depois de excluir o original.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top