在同一个文件夹中,我有数千个csv文件名,如下file_x_x.csv,其中x是1到10000之间的数字。每个文件包含一个标题和一个行数据:
file_1_1.csv
Name Surname Age Address
Michael O'Donnel 22 George St.
file_2_2.csv
Name Surname Age Address
Mary Jane 34 Camden St.
等等
我正在寻找创建一个单一的文件,包括所有这些行:
final_file.csv
Name Surname Age Address
Michael O'Donnel 22 George St.
Mary Jane 34 Camden St.
…
我的方法:
import pandas as pd
import glob
path = # add path
all_files = glob.glob(path + ".csv") # look for all the csv files in that folder. Probably this is not the right code for looking at them
file_list = []
for filename in all_files:
df = pd.read_csv(filename)
file_list(df)
我不知道如何在最后创建一个唯一的文件。你能看看上面的代码,告诉我如何得到想要的输出,如果我错过了什么?
您不需要做任何复杂的事情。你知道标题行,你知道你想要的是所有,除了标题。只需打开文件,跳过第一行,然后写入。这比在内存中消耗一堆数据帧要有效得多。
import glob
with open("final_file.csv", "w") as outfile:
for count, filename in enumerate(glob.glob(path + ".csv")):
with open(filename) as infile:
header = next(infile)
if count == 0:
outfile.write(header)
line = next(infile)
if not line.startswith("n"):
line = line + "n"
outfile.write(line)
我建议使用pd。concat将这些DataFrame合并成一个大的DataFrame,如果您愿意,可以将它保存到另一个文件中。
在连接dataframe之前,您可能必须修改对pd.read_csv
的调用,以确保正确处理数据。如果问题中的示例数据与CSV文件的内容一字不差地匹配,那么代码片段将如下所示:
import pandas as pd
import glob
path = "/my_path" # set this to the folder containing CSVs
names = glob.glob(path + "*.csv") # get names of all CSV files under path
# If your CSV files use commas to split fields, then the sep
# argument can be ommitted or set to ","
file_list = pd.concat([pd.read_csv(filename, sep=" ") for filename in names])
#save the DataFrame to a file
file_list.to_csv("combined_data.csv")
注意,合并索引中的每一行仍将根据其源文件中的行号进行索引,从而创建重复的行索引。要更改它,请调用pd.DataFrame.reset_index()
file_list = file_list.reset_index(drop=True)