web-dev-qa-db-fra.com

Python - réorganisation des colonnes dans un csv

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.

17
JJ1603

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
17
Josh J

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)
6
titipata

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
1
MisterMiyagi
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()
1
Prune

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
1
thisismario123