我有一个文件夹,其文件格式为 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,但无法使其正常运行。有人可以帮我这个忙吗?
答案 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内容