Pergunta

Eu estou tentando extrair um monte de linhas de um arquivo CSV e gravá-los em outro, mas eu estou tendo alguns problemas.

import csv

f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames

target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)

while True:
try:
    row = r.next()
    if r.line_num <= 2: #first two rows don't matter
        continue
    else:
        w.writerow(row)

except StopIteration:
    break

f.close()
target.close()

A execução deste, eu recebo o seguinte erro:

Traceback (most recent call last):
File "unify.py", line 16, in <module>
    w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
    return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
    if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable

Não inteiramente certo o que eu sou dong errado.

Foi útil?

Solução

Eu também não sei, mas desde que tudo que você está fazendo é copiar linhas de um arquivo para outro por que você está incomodando com o material csv em tudo? Por que não algo como:

f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')

f.readline()
f.readline()
for line in f:
    target.write(line)

Outras dicas

Para esclarecer a confusão sobre o erro: você obtê-lo, porque r.fieldnames só é definido depois de ler a partir do arquivo de entrada para o primeiro tempo usando r. Daí a maneira que você escreveu, fieldnames sempre será inicializado para None.

Você pode inicializar w = csv.DictWriter(united, fieldnames=fieldnames) com r.fieldnames somente depois de ler a primeira linha de r, o que significa que você teria que reestruturar seu código.

Este comportamento está documentado no biblioteca padrão Python documentação

objetos DictReader tem o seguinte atributo público:

csvreader.fieldnames

Se não for passado como um parâmetro ao criar o objeto, este atributo é inicializado após o primeiro acesso ou quando o primeiro registro é lido a partir do arquivo.

Quanto à exceção, parece que esta linha:

w = csv.DictWriter(united, fieldnames=fieldnames)

deve ser

w = csv.DictWriter(target, fieldnames=fieldnames)

A razão que você está recebendo o erro é mais provável que seu arquivo CSV original (my_csv_file.csv) não tem uma linha de cabeçalho. Portanto, quando você construir o objeto leitor, o seu campo fieldnames está definido para None.

Quando você tentar escrever uma linha usando o escritor, ele primeiro verifica para garantir que não há chaves no dict que não estão em sua lista de campos conhecidos. Desde fieldnames está definido para None, uma tentativa de excluir a referência o nome da chave lança uma exceção.

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