Python 如何合并多个CSV文件?
我有大约7500个csv,需要合并成一个csv,以便创建一个易于阅读的表。 文件格式如下:Python 如何合并多个CSV文件?,python,excel,csv,Python,Excel,Csv,我有大约7500个csv,需要合并成一个csv,以便创建一个易于阅读的表。 文件格式如下: 每个文件都以股票的股票代码命名(例如:AA.csv、AAL.csv、AAPL.csv等) 每个文件本身都包含此格式的日期和数字 2018-10-11,1 2018-10-12,3 2018-10-15,2 ... 现在,我想将它们合并到一个单一的csv文件中,其中生成的表的标题中有股票代码的名称,第一列中有日期,后面是数字(显然保持csv格式) 例如: 请注意,有些csv文件是空的,有些文件有不同
2018-10-11,1
2018-10-12,3
2018-10-15,2
...
请注意,有些csv文件是空的,有些文件有不同的开始日期,有些文件只是不连续的您可以这样做:
将熊猫作为pd导入
将numpy作为np导入
从全局导入全局
dfs_列表=[]
对于glob中的csv_文件(“Tickers List/*.csv”):
股票代码=csv文件。拆分(“.”[0]
df=pd.read\u csv(csv\u文件,头=None,名称=[“日期”,“数值”])
如果df.shape[0]>0:
df[“date”]=pd.to_datetime(df[“date”],格式=“%Y-%m-%d”)
df[“股票代码”]=股票代码
dfs_列表。追加(df)
最终df=pd.concat(dfs\U列表)
使用glob('dir/*.csv')
我们可以在一个文件夹中获取所有csv文件
在此之后,您将拥有一个数据帧,其外观如下:
如果要更改格式,可以执行以下操作:
(请注意,日期会自动排序,因为它用作索引)
final_df=pd.pivot_表(final_df,values='num',index='date'],
列=['stock\u ticker'],fill\u value=np.nan)
您将有一个如下所示的数据帧:
现在,您可以使用以下命令将此数据帧写入新的csv:
final_df.to_csv(“merged.csv”)
完整代码
将熊猫作为pd导入
将numpy作为np导入
从全局导入全局
dfs_列表=[]
对于glob中的csv_文件(“Tickers List/*.csv”):
股票代码=csv文件。拆分(“.”[0]
df=pd.read\u csv(csv\u文件,头=None,名称=[“日期”,“数值”])
如果df.shape[0]>0:
df[“date”]=pd.to_datetime(df[“date”],格式=“%Y-%m-%d”)
df[“股票代码”]=股票代码
dfs_列表。追加(df)
最终df=pd.concat(dfs\U列表)
final_df=pd.pivot_表(final_df,values='num',index='date'],
列=['stock\u ticker'],fill\u value=np.nan)
最终文件至csv(“合并的csv”)
由于您有非统一的CSV和一些特定要求:
- 输出csv的特定格式
- 一些csv文件是空的
- 某些csv文件具有不同的开始日期
- 某些csv文件已中断日期
csv
模块执行以下操作:
[“AA.csv”,“AAL.csv”。]但是我需要选择一个文件夹中的所有文件,因为它们太多了,所以我无法将它们写下来。它们都在同一个文件夹中吗?是的。我需要替换第一部分中的某些内容吗?就像dir路径一样?你需要在glob中更改csvs dir路径。“告诉我如何解决这个编码问题”是很重要的。我们希望您先做一个测试,然后问一个关于您的实现的具体问题。我得到了这个错误:回溯(上次的最新调用):文件“C:\Users\Diego\PycharmProjects\thesis\MERGE.py”,第16行,以r:FileNotFoundError:[Errno 2]的形式打开(csv_文件,'r')没有这样的文件或目录:“A.csv”可能是因为文件名仅为A,AA,没有.csv(但它们是csv)我如何解决?请将
csv\u dir
变量值替换为所有csv所在的文件夹!好的,我会编辑代码。试试新版本!相同错误“没有这样的文件或目录:'A.csv'”我编辑了csv目录路径如下:csv_dir=r'C:\Users\Diego\PycharmProjects\thesis\Tickers List“我复制并粘贴了csv文件所在的路径,我知道发生了什么。”。。我编辑了代码!行中的路径(csv\u dir+csv\u file,'r')为r:
需要正确。我添加了一个指纹来检测它!检查最新代码!不,那更糟。现在错误是:回溯(最近一次调用上次):文件“C:\Users\Diego\PycharmProjects\thesis\MERGE.py”,第17行,打开(csv_dir+csv_File,'r')作为r:FileNotFoundError:[Errno 2]没有这样的文件或目录:“C:\\Users\\Diego\\PycharmProjects\\thesis\\Tickers ListA.csv”
import os,csv
csv_dir = "C:\\Users\Diego\\PycharmProjects\\thesis\\Tickers List\\"
csv_out = 'csvout.csv'
all_dates = []
fin_table = dict()
# iterating over all csv files
for csv_file in os.listdir(csv_dir):
if True:
csv_name = csv_file #[:-4] # excluding the ".csv" extension
table = dict()
print(csv_dir+csv_file)
with open(csv_dir+csv_file, 'r') as r:
csvReader = csv.reader(r)
for i, row in enumerate(csvReader):
all_dates.append(row[0])
table[row[0]] = row[1]
fin_table[csv_name] = table
# populating the final csv
with open(csv_out, 'w+') as w:
csvWriter = csv.writer(w)
# adding the header
input_row = ['Dates']
for stock, table in iter(sorted(fin_table.items())):
input_row.append(stock)
csvWriter.writerow(input_row)
# Adding the rest of the table by available date
# since, some dates may not have a value, as you said
for date in sorted(all_dates):
# adding the date rows and stock values 1 by 1
input_row = [date]
for stock, table in iter(sorted(fin_table.items())):
# NOVALUE will be put in cells
# where a value doesn't exist for a date
input_row.append(table.get(date, 'NOVALUE'))
csvWriter.writerow(input_row)
# ************************** end of program code