J'ai un tas de fichiers CSV avec les mêmes colonnes, mais dans un ordre différent. Nous essayons de les télécharger avec SQL * Plus mais nous avons besoin des colonnes avec un arrangement de colonne fixe.
Exemple
commande requise: A B C D E F
fichier csv: A C D E B (parfois une colonne n'est pas dans le csv car elle n'est pas disponible)
est-ce réalisable avec python? nous utilisons Access + Macros pour le faire ... mais cela prend trop de temps
PS. Désolé si quelqu'un s'énerve pour mes compétences en anglais.
Vous pouvez utiliser le module csv pour lire, réorganiser, puis écrire votre fichier.
Exemple de fichier:
$ cat file.csv
A,B,C,D,E
a1,b1,c1,d1,e1
a2,b2,c2,d2,e2
Code
import csv
with open('file.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:
# output dict needs a list for new column ordering
fieldnames = ['A', 'C', 'D', 'E', 'B']
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
# reorder the header first
writer.writeheader()
for row in csv.DictReader(infile):
# writes the reordered rows to the new file
writer.writerow(row)
sortie
$ cat reordered.csv
A,C,D,E,B
a1,c1,d1,e1,b1
a2,c2,d2,e2,b2
Un moyen de résoudre ce problème consiste donc à utiliser la bibliothèque pandas
qui peut être facilement installée à l’aide de pip
. En gros, vous pouvez télécharger le fichier csv
sur pandas dataframe, puis réorganiser la colonne et la sauvegarder dans le fichier csv
. Par exemple, si votre sample.csv
ressemble à celui ci-dessous:
A,C,B,E,D
a1,b1,c1,d1,e1
a2,b2,c2,d2,e2
Voici un extrait pour résoudre le problème.
import pandas as pd
df = pd.read_csv('/path/to/sample.csv')
df_reorder = df[['A', 'B', 'C', 'D', 'E']] # rearrange column here
df_reorder.to_csv('/path/to/sample_reorder.csv', index=False)
Le module csv
vous permet de lire des fichiers csv avec leurs valeurs associées à leurs noms de colonnes. Cela vous permet à son tour de réorganiser les colonnes sans avoir à permuter explicitement les listes.
for row in csv.DictReader(open("foo.csv")):
print row["b"], row["a"]
2 1
22 21
Étant donné le fichier foo.csv :
a,b,d,e,f
1,2,3,4,5
21,22,23,24,25
csv_in = open("<filename>.csv", "r")
csv_out = open("<filename>.csv", "w")
for line in csv_in:
field_list = line.split(',') # split the line at commas
output_line = ','.join(field_list[0], # rejoin with commas, new order
field_list[2],
field_list[3],
field_list[4],
field_list[1]
)
csv_out.write(output_line)
csv_in.close()
csv_out.close()
Vous pouvez utiliser quelque chose de similaire à this pour changer l'ordre en remplaçant ';' avec ',' dans votre cas… .. Parce que vous avez dit que vous deviez créer plusieurs fichiers .csv, vous pourriez utiliser le module glob pour obtenir une liste de vos fichiers.
for file_name in glob.glob('<Insert-your-file-filter-here>*.csv'):
#Do the work here