在让我的神经受损之前,只是一个关于指导的快速问题! :)
我有多个CSV文件,我想合并到一个BIG新CSV文件。
所有文件都具有相同的确切结构:
Muzicast V2;;;;;;;;
Zoom mÈdia sur Virgin Radio;;;;;;;;;
Sem. 16 : Du 15 avril 2016 au 21 avril 2016;;;;;;;;;
;;;;;;;;;
;;;;;;;;;
TOP 40;;;;;;;;;
Rg;Evo.;Rg-1;Artiste;Titre;Genre;Label;Audience;Nb.Diffs;Nb.Sem
1;+3;4;Twenty One Pilots;Stressed out;Pop/Rock International;WEA;5 982 000;56;18
2;+1;3;Coldplay;Hymn for the weekend;Pop/Rock International;WEA;5 933 000;55;13
3;-2;1;Imany;Don't be so shy (Filatov & Karas remix);Dance;THINK ZIK;5 354 000;55;7
4;-2;2;Lukas Graham;7 years;Pop/Rock International;POLYDOR;5 927 000;54;16
5; =;5;Justin Bieber;Love yourself;Pop/Rock International;MERCURY GROUP;5 481 000;49;21
所有cvs文件都具有相同的格式。
我想要 :
- 一个接一个地打开每个文件/忽略10个第一行
- 使用“;”获取所有信息作为分隔符
- 在每行的开头插入变量
- 使用每个文件中的所有信息写入新文件。
我设法打开一个文件并进行了我需要的更改:
handle = open(file_dir+'/'+'virgin092016.csv','r')
results = []
for line in handle :
line = '12;2016;'+line
line = line.lower()
line = line.strip()
line = line.split(';')
line = line[0],line[1],line[5]
results.append(line)
df = pd.DataFrame(results)
print df
我设法打开多个文件并创建一个DataFrame =
file_dir = "VIRGIN"
main_df = pd.DataFrame()
for i, file_name in enumerate(os.listdir(file_dir)):
if i == 0 :
main_df = pd.read_csv(file_dir + "/" + file_name, sep=";")
main_df["file_name"] = file_name
else :
current_df = pd.read_csv(file_dir + "/" + file_name, sep=";")
current_df["file_name"] = file_name
current_df = current_df
main_df = pd.concat([main_df,current_df],ignore_index=True)
print main_df
但是现在我有一个问题是试图同时做这两件事。
我错过了一个部分,我认为这是因为我不确定我必须执行代码的顺序。
我是否必须打开一个文件进行更改,然后直接写入MAIN.CSV(将包含所有文件的最终信息),然后执行DataFrame 或者我应该打开一个文件>做一个数据框,然后进行我需要的更改。
我是蟒蛇新手...参加多个在线课程和阅读书籍....但我觉得我的思维方式仍然不是真正的“pythonic”。
非常感谢帮助。 感谢
答案 0 :(得分:0)
我假设您的所有csv文件都在"./data/"
中,在main_dir
中定义,并且所有csv的总和不超过您的RAM内存。诀窍是使用临时变量current_df
,然后将其附加到final_df
的最终数据框pd.concat
。
import os
import pandas as pd
main_dir = "./data/"
all_files = os.listdir(main_dir)
for i, file_name in enumerate(all_files):
current_df = pd.read_csv(main_dir+file_name,
sep=";",
skiprows=10)
#add here whatever information you need to your dataframe
#dump the results into a separate file with current_df.to_csv()
if i == 0:
final_df = current_df
else:
final_df = pd.concat([final_df, current_df], axis=0)