Подтвердить что ты не робот

Python - переупорядочивание столбцов в csv

У меня есть куча csv файлов с одинаковыми столбцами, но в другом порядке. Мы пытаемся загрузить их с помощью SQL * Plus, но нам нужны столбцы с фиксированным расположением столбцов.

Пример

требуемый порядок: A B C D E F

csv файл: A C D E B (иногда столбец не находится в csv, потому что он недоступен)

возможно ли это с помощью python? мы используем Access + Macros для этого... но это слишком много времени

PS. Извините, если кто-то расстроится за свои навыки английского языка.

4b9b3361

Ответ 1

Вы можете использовать модуль csv для чтения, изменения порядка, а затем и для записи вашего файла.

Пример файла:

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

код

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)

Выход

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

Ответ 2

Итак, одним из способов решения этой проблемы является использование библиотеки pandas, которую можно легко установить с помощью pip. В принципе, вы можете загрузить csv файл в pandas dataframe, а затем переупорядочить столбец и сохранить его обратно в файл csv. Например, если ваш sample.csv выглядит следующим образом:

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

Вот фрагмент для решения проблемы.

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)

Ответ 3

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()

Ответ 4

Вы можете использовать что-то похожее на this, чтобы изменить порядок, заменив ';' с ',' в вашем случае. Поскольку вы сказали, что вам нужно сделать несколько CSV файлов, вы можете использовать модуль glob для списка ваших файлов.

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

Ответ 5

Модуль csv позволяет вам читать файлы csv с их значениями, связанными с их именами столбцов. Это, в свою очередь, позволяет произвольно переупорядочить столбцы без необходимости явно переписывать списки.

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

2 1
22 21

Для файла foo.csv:

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