我有一个带有几行标题的csv文件。接下来,我获得了sample(1)数据,接下来又是标头和sample(2)数据。文件中的样本(和标头)数量不是恒定的。
DF看起来像这样:
[header]
InfoMap : 4214
InfoSample:3122
Content:, ,22dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Ana 22 785 a6659
Ana 22 785 a658141
Ana 22 785 csd449
Ben 23 756 a6659
Ben 23 756 a658141
Charlie 44 733 c658141
[header]
InfoMap : 423421
InfoSample:315
Content, ,562dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Cris 82 7835 a6659
Cris 82 7485 a658141
Cris 82 7485 csd449
MATT 53 268 a6659
MATT 53 268 a658141
Dan 42 885 c658141
我试图做的是: 我需要将每个标头与示例拆分为新文件。因此,在上述情况下,我应该得到2个文件:
文件1:
[header]
InfoMap : 4214
InfoSample:3122
Content:, ,22dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Ana 22 785 a6659
Ana 22 785 a658141
Ana 22 785 csd449
Ben 23 756 a6659
Ben 23 756 a658141
Charlie 44 733 c658141
文件2:
[header]
InfoMap : 423421
InfoSample:315
Content, ,562dmm
Sample_name, Sample_id, Sample_phone, Sample_project
Cris 82 7835 a6659
Cris 82 7485 a658141
Cris 82 7485 csd449
MATT 53 268 a6659
MATT 53 268 a658141
Dan 42 885 c658141
如何在熊猫或核心Python中以最简单的方式做到这一点?正如我所说的,标头和样本的数量不是恒定的。
我尝试了以下循环:
问题是:因为它是一列数据帧(因为有标题),所以我无法将其读取为csv,因为我有混合样本的文件,所以行的读取方式很奇怪。
我正在寻找更好的概念。也许Pandas具有一些我不知道的功能。如果没有,我会继续做事,并尝试这样做。
我不一定要寻找现成的解决方案,而是一些提示或概念。
答案 0 :(得分:1)
这是根据我在注释中给出的逻辑的伪代码示例代码,假定“ InfoMap”是标头的起点:
dataList = []
with open('YourData.csv', newline='') as File:
reader = csv.reader(File)
dataList = []
count = 0
for row in reader:
if "InfoMap" in row[0]:
count += 1
if count > 1:
#fileName = "file" + str(count)
#WriteDataListToCSV(dataList, fileName) create a function that can write dataList into csv
#print(dataList)
dataList = []
dataList.append(row)
else:
dataList.append(row)
else:
dataList.append(row)
#fileName = "file" + str(count)
#WriteDataListToCSV(dataList)
#print(dataList)
您可以取消注释打印语句以查看dataList包含的内容
答案 1 :(得分:0)
另一个psedocode(或错误的真实代码)。唯一的变化是您没有将数据写入列表。
file_no = 0
write_file = open(f"sub_file_{file_no}.csv", "a+")
with open("input.csv") as in_file:
reader = csv.reader(in_file)
for row in reader:
if row[0] == "[header]":
# At the start of a new file. Close the old, increment count, open new
write_file.close()
file_no += 1
write_file = open(f"sub_file_{file_no}.csv", "a+")
# Just pass current row into the currently open file
write_file.write(row)
write_file.close()