如何将每两个csv文件从一个文件夹串联到一个csv文件中?

时间:2019-04-04 05:33:16

标签: python database pandas dataframe concatenation

我有一个文件夹,其文件格式为 p1_1001.csv,p1_1002csv,p2_1001.csv,p2_1002.csv ...

它们是单个候选人的第1部分和第2部分数据 1001,1002 ...

我想为每个候选人组合p1和p2。也就是说,从存储两个部分数据的文件夹中为每个候选文件生成一个单独的csv文件。 1001,1002,1003 .. 因此,第一部分是从1-49的跟踪编号,第二部分是从50到99的跟踪路径。我想将PI与p2串联而没有p2的标头,因此在一个文件夹中将试验1到100的参与者1001的一个csv文件< / p>

我曾尝试使用glob,但无法使其正常运行。有人可以帮我这个忙吗?

2 个答案:

答案 0 :(得分:1)

我已经使用 glob 进行了尝试,它应该可以正常工作。

import pandas as pd
import glob

_candidates = ['1001', '1002'] # All candidates
_candidate_files = [(candidate, glob.glob('./*{}.csv'.format(candidate))) for candidate in _candidates]

for candidate in _candidate_files:
    df = []
    for file in candidate[1]:
        file_df = pd.read_csv(file)
        df.append(file_df)
    df = pd.concat(df, axis=0)
    df.to_csv(candidate[0] + '.csv')

对于您想要最终df的所有候选者,填充列表。假设 p1 p2 具有对齐的列,这是很有用的。

答案 1 :(得分:0)

一些想法:

from os import listdir
from os.path import isfile, join

# step 1: list all csv in that directory
mypath = './foo/bar' # this should point to the directory where the csv resides
csvs = [f for f in listdir(mypath) if ('csv' in f and  isfile(join(mypath, f)))]    

# step 2: group CSVs that belong to one candidate
groups = {}
for c in csvs:
    (pNum, candidate) = c.split('_')
    if candidate not in groups:
        groups[candidate] = []
    groups[candidate].append(c)


# step 3: read contents for each group, append to one file
for candidate in groups:
    files = groups[candidate]        
    for f in files:
        with open(join(mypath, f) , 'r') as file:
            data = file.read()

        with open(candidate, 'a+') as outFile:                                
            outFile.write(data)
            # if you need to append newline at the end of every segment:
            outFile.write('\n')                

附录:如果使用pandas不是问题,我强烈建议您将pandas.read_csv视为处理csv的相对轻松且无忧的方法。如果您在pandas DataFrame内操作,也可以执行pd.concat([df1, df2])docs here)来逻辑上合并csv内容