Estou usando o código abaixo indicado para editar um csv usando Python. As funções chamadas no código formam a parte superior do código.
Problema: Desejo que o código abaixo mencionado comece a editar o csv da 2ª linha. Quero excluir a 1ª linha que contém os cabeçalhos. No momento, ele está aplicando as funções somente na 1ª linha e minha linha de cabeçalho está sendo alterada.
in_file = open("tmob_notcleaned.csv", "rb")
reader = csv.reader(in_file)
out_file = open("tmob_cleaned.csv", "wb")
writer = csv.writer(out_file)
row = 1
for row in reader:
row[13] = handle_color(row[10])[1].replace(" - ","").strip()
row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip()
row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip()
row[10] = handle_gb(row[10])[0].strip()
row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip()
row[15] = handle_addon(row[10])[1].strip()
row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip()
writer.writerow(row)
in_file.close()
out_file.close()
Tentei resolver esse problema inicializando a row
variável para 1
mas não funcionou.
Por favor, ajude-me a resolver esse problema.
python
python-2.7
csv
Martijn Pieters
fonte
fonte
Respostas:
Sua
reader
variável é iterável. Ao fazer o loop, você recupera as linhas.Para fazer com que ele pule um item antes do loop, basta chamar
next(reader, None)
e ignorar o valor de retorno.Você também pode simplificar um pouco o seu código; use os arquivos abertos como gerenciadores de contexto para fechá-los automaticamente:
Se você deseja gravar o cabeçalho no arquivo de saída não processado, também é fácil, passe a saída
next()
parawriter.writerow()
:fonte
for row in islice(reader, 1, None)
- embora seja menos explícito do quenext
para os trabalhos mais simples "pular uma linha", pular várias linhas de cabeçalho (ou obter apenas alguns trechos etc ...) é bastante útiltry: writer.write(next(reader))... except StopIteration: # handle empty reader
try:
/except:
.next
iteração explícita é que ela é "gratuita";islice
envolveria areader
adição permanente (uma quantidade muito pequena de) de sobrecarga a cada iteração. Aconsume
receita deitertools
pode ser usada para pular muitos valores rapidamente, sem adicionar empacotamento para uso subsequente, no caso em queislice
isso teria umstart
mas nãoend
, para que a sobrecarga não esteja ganhando nada.Outra maneira de resolver isso é usar a classe DictReader, que "ignora" a linha do cabeçalho e a usa para permitir a indexação nomeada.
Dado "foo.csv" da seguinte maneira:
Use o DictReader assim:
fonte
If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.
Veja docs.python.org/2/library/csv.htmlFazer
row=1
não mudará nada, porque você apenas substituirá isso pelos resultados do loop.Você quer fazer
next(reader)
para pular uma linha.fonte
for row in next(reader):
mas está me dando umIndexError: string index out of range
erronext(reader); for row in reader:
....