以下内容应该可以帮助您开始。这假设您有一个包含所有CSV文件的文件夹,并且每个CSV文件具有相同的格式,即类似于:
Date,Open,High,Low,Close,Volume,Market Cap
"Sep 22, 2017",1.23,1.25,1.14,1.24,513898,12916700
"Sep 23, 2017",1.28,1.35,1.18,1.23,1700200,13448400
当您试图水平写入数据时,需要将所有数据收集到内存中,然后才能写入。该脚本一次读取一个文件,并将每一行分配给一个字典字典。第一个持有
date
第二个包含有该日期条目的所有货币。这个
日期
转换为
datetime
对象,以确保在写入输出CSV文件时可以对其进行正确排序。读取每个文件时,其名称存储在一个集合中,以便提供货币名称的最终列表。
要输出,将对货币名称进行排序,并显示
DictWriter
用于保存所有值。这样做的好处是为任何丢失的数据存储空值:
from collections import defaultdict
from operator import itemgetter
from datetime import datetime
import csv
import glob
import os
req_cols = itemgetter(0, 6)
all_data = defaultdict(dict)
currencies = set()
date_format1 = '%b %d, %Y' # e.g. "Sep 22, 2017"
date_format2 = '%B %d, %Y' # e.g. "June 22, 2017"
for csv_filename in glob.glob('*.csv'):
with open(csv_filename, newline='') as f_input:
currency_name = os.path.splitext(os.path.basename(csv_filename))[0]
csv_input = csv.reader(f_input)
header = next(csv_input)
currencies.add(currency_name)
for row in csv_input:
date, market_cap = req_cols(row)
try:
date = datetime.strptime(date, date_format1)
except ValueError: # Try "June 22, 2017"
date = datetime.strptime(date, date_format2)
all_data[date][currency_name] = market_cap
currencies = sorted(currencies)
with open('output.csv', 'w', newline='') as f_output:
header = ['Date'] + currencies
csv_output = csv.DictWriter(f_output, fieldnames=header)
csv_output.writeheader()
for date, entries in sorted(all_data.items()):
entries['Date'] = date.strftime(date_format1)
csv_output.writerow(entries)