2015-10-07 29 views
13

Ho un mucchio di file csv con le stesse colonne ma in ordine diverso. Stiamo cercando di caricarli con SQL * Plus, ma abbiamo bisogno che le colonne con una colonna fissa organizzino.Python - riordino delle colonne in un csv

Esempio

ordine richiesto: Un file

csv B C D E F: A C D E B (talvolta una colonna non è nel csv perché non è disponibile)

è realizzabile con pitone? stiamo usando Access + Macro per farlo ... ma è troppo dispendioso in termini di tempo

PS. Scusa se qualcuno si arrabbia per le mie capacità di inglese.

+0

Sì, lo è. Usa uno schema regex e via vai. – ergonaut

risposta

14

È possibile utilizzare il csv module per leggere, riordinare, e quindi e scrivere il file.

file di esempio:

$ cat file.csv 
A,B,C,D,E 
a1,b1,c1,d1,e1 
a2,b2,c2,d2,e2 

Codice

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) 

uscita

$ cat reordered.csv 
A,C,D,E,B 
a1,c1,d1,e1,b1 
a2,c2,d2,e2,b2 
+1

Davvero un ottimo uso di 'DictReader' /' DictWriter'. –

1
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

Cosa succede se ci sono stringhe tra virgolette contenenti virgole? –

1

Si può usare qualcosa di simile a this per cambiare l'ordine, in sostituzione di ';' con ',' nel tuo caso. Perché hai detto che avevi bisogno di fare più file .csv, è possibile utilizzare il modulo glob per un elenco dei file

for file_name in glob.glob('<Insert-your-file-filter-here>*.csv'): 
    #Do the work here 
1

Il modulo csv consente di leggere i file CSV con i loro valori associati ai nomi delle colonne. Questo a sua volta consente di riorganizzare arbitrariamente le colonne, senza dover esplicitamente permutare le liste.

for row in csv.DictReader(open("foo.csv")): 
    print row["b"], row["a"] 

2 1 
22 21 

Dato il file foo.csv:

a,b,d,e,f 
1,2,3,4,5 
21,22,23,24,25 
4

Quindi un modo per affrontare Thi Il problema è usare la libreria pandas che può essere facilmente installata usando pip. Fondamentalmente, è possibile scaricare il file csv in dataframe pandas, quindi riordinare la colonna e salvarla nel file csv. Ad esempio, se il sample.csv si presenta come di seguito:

A,C,B,E,D                             
a1,b1,c1,d1,e1                           
a2,b2,c2,d2,e2 

Ecco un frammento di risolvere il problema.

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) 
+0

grazie, mi ha salvato la vita – code4j

Problemi correlati