将行字段名称转换为标题csv

时间:2017-11-15 18:38:25

标签: python csv

我有一个python脚本,它运行一千个csv文件并根据我指定的日期提取行并将它们放在一个新的csv中。在这种情况下,DATE等于10-15-2017。生成的csv文件看起来像附加图像。

我希望它看起来像带有列标题的正确csv。

STATION, DATE, LATITUDE, LONGITUDE, ...
USW0003013, 10-15-2017, 36.7876, -105.6434, ...
USW0003016, 10-15-2017, 37.5456, -103.5671, ...

enter image description here

我已经完成了一些搜索,但只找到了有关从行到列的转置的信息,但由于我在行中有字段名称,我认为这不会起作用。

以下是我用来从每个csv文件(超过一千)中提取行的代码,其中DATE是10-15-2017。

path = "C:/py-testing/downloads/*.csv"

for fname in glob.glob(path):

     with open(fname, 'rb') as f:
         reader = csv.DictReader(f)
         rows = [
             row 
             for row in reader
             if row['DATE'] == "2017-10-15"
         ]
     for row in rows:
         with open("C:/py-testing/output.csv", "ab") as f:
             writer = csv.writer(f, delimiter = ',')
             writer.writerow([row])

2 个答案:

答案 0 :(得分:2)

使用pandas模块可以轻松完成此操作,如下所示:

import pandas as pd

path = "C:/py-testing/downloads/*.csv"

csv_all = []
for fname in glob.glob(path):
    csv_all.append(pd.read_csv(fname))

df = pd.concat(csv_all)
df = df.loc[df['DATE'] == "2017-10-15"]
#Choose the columns you need
df = df[['STATION', 'DATE', 'LATITUDE', 'LONGITUDE']]
df.to_csv('./csv_merged.csv')

答案 1 :(得分:0)

如果您想添加自定义标题,只需将它们作为第二个参数传递给DictWriter(在您的情况下,字段名称等于row.keys())。

以下是一个例子:

import csv

data = []
for i in range(10):
    data.append({'Date': '10-15-2017', 'LATITUDE': i+30})

with open('csv_with_headers.csv', 'wb') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "LATITUDE"])
    writer.writeheader()
    writer.writerows(data)

输出:

cat csv_with_headers.csv
Date,LATITUDE
10-15-2017,30
10-15-2017,31
10-15-2017,32
10-15-2017,33
10-15-2017,34
10-15-2017,35
10-15-2017,36
10-15-2017,37
10-15-2017,38
10-15-2017,39