簡體   English   中英

Python - 在csv中重新排序列

[英]Python - re-ordering columns in a csv

我有一堆具有相同列但順序不同的csv文件。 我們正在嘗試使用SQL * Plus上傳它們,但我們需要具有固定列排列的列。

所需訂單:ABCDEF

csv文件:ACDEB(有時列不在csv中,因為它不可用)

用python可以實現嗎? 我們正在使用Access +宏來完成它......但它太耗時了

PS。 對不起,如果有人對我的英語技能感到不滿。

您可以使用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

因此,解決此問題的一種方法是使用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)
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()

您可以使用與此類似的內容來更改順序,替換“;” 在你的情況下用','。 因為您說您需要執行多個.csv文件,所以您可以使用glob模塊來獲取文件列表

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM