Suppression de colonnes dans un CSV avec python
j'ai été capable de créer un csv avec python en utilisant les entrées de plusieurs utilisateurs sur ce site et je tiens à exprimer ma gratitude pour vos messages. Maintenant je suis perplexe et le poster à ma première question.
ma contribution.csv ressemble à ceci:
day,month,year,lat,long
01,04,2001,45.00,120.00
02,04,2003,44.00,118.00
j'essaie de supprimer la colonne "année" et toutes ses entrées. Au total, il y a plus de 40 entrées avec une fourchette d'années allant de 1960 à 2010.
7 réponses
import csv
with open("source","rb") as source:
rdr= csv.reader( source )
with open("result","wb") as result:
wtr= csv.writer( result )
for r in rdr:
wtr.writerow( (r[0], r[1], r[3], r[4]) )
BTW, the for
boucle peut être supprimé, mais pas vraiment simplifié.
in_iter= ( (r[0], r[1], r[3], r[4]) for r in rdr )
wtr.writerows( in_iter )
vous pouvez aussi coller de façon hyper-littérale aux exigences pour supprimer une colonne. Pour moi c'est une mauvaise politique en général, car il ne s'applique pas à retirer plus que sur la colonne. Lorsque vous essayez de supprimer la seconde, vous découvrez que les postes ont tous changé et la ligne n'est pas évidente. Mais pour une colonne seulement, ça marche.
del r[2]
wtr.writerow( r )
l'Utilisation du module Pandas sera beaucoup plus facile.
import pandas as pd
f=pd.read_csv("test.csv")
keep_col = ['day','month','lat','long']
new_f = f[keep_col]
new_f.to_csv("newFile.csv", index=False)
Et voici une petite explication:
>>>f=pd.read_csv("test.csv")
>>> f
day month year lat long
0 1 4 2001 45 120
1 2 4 2003 44 118
>>> keep_col = ['day','month','lat','long']
>>> f[keep_col]
day month lat long
0 1 4 45 120
1 2 4 44 118
>>>
en utilisant un DCT pour saisir des titres puis en faisant une boucle vous obtenez ce dont vous avez besoin proprement.
import csv
ct = 0
cols_i_want = {'cost' : -1, 'date' : -1}
with open("file1.csv","rb") as source:
rdr = csv.reader( source )
with open("result","wb") as result:
wtr = csv.writer( result )
for row in rdr:
if ct == 0:
cc = 0
for col in row:
for ciw in cols_i_want:
if col == ciw:
cols_i_want[ciw] = cc
cc += 1
wtr.writerow( (row[cols_i_want['cost']], row[cols_i_want['date']]) )
ct += 1
vous pouvez utiliser le csv
paquet pour itérer sur votre fichier csv et la sortie des colonnes que vous voulez à un autre fichier csv.
import csv
file_name = 'C:\Temp\my_file.csv'
output_file = 'C:\Temp\new_file.csv'
csv_file = open(file_name, 'r')
## note that the index of the year column is excluded
column_indices = [0,1,3,4]
with open(output_file, 'w') as fh:
reader = csv.reader(csv_file, delimiter=',')
for row in reader:
tmp_row = []
for col_inx in column_indices:
tmp_row.append(row[col_inx])
fh.write(','.join(tmp_row))
hors de ma tête, cela le fera sans aucune sorte de vérification d'erreur ni capacité de configurer quoi que ce soit. C'est"laissé au lecteur".
outFile = open( 'newFile', 'w' )
for line in open( 'oldFile' ):
items = line.split( ',' )
outFile.write( ','.join( items[:2] + items[ 3: ] ) )
outFile.close()
cela dépend de la façon dont vous stockez le CSV analysé, mais généralement vous voulez l'opérateur del.
Si vous avez un tableau des dicts:
input = [ {'day':01, 'month':04, 'year':2001, ...}, ... ]
for E in input: del E['year']
Si vous avez un tableau de tableaux:
input = [ [01, 04, 2001, ...],
[...],
...
]
for E in input: del E[2]
Vous pouvez supprimer directement la colonne avec juste
del variable_name['year']