将csv拆分为几行

2024-10-04 07:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,头上有几行。接下来我得到了一个示例(1)数据,接下来是头和示例(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

如何在pandas或core Python中以最简单的方式完成它?正如我所说的,头和样本的数量不是恒定的。你知道吗

我试了一下:

  • 在行中查找[标题]
  • 保存所有[标题]行的编号索引编号。你知道吗
  • 用“open”我试着把所有的隔间都保存到新的文件里

问题是:我不能把它读成csv,因为它是一列数据帧(因为标题),行的读取方式很奇怪,因为我有混合样本的文件。你知道吗

我在找一个更好的主意。也许熊猫有一些我不知道的功能。如果没有,我会继续用我的方式做事,并尝试这样做。你知道吗

我不一定要寻找现成的解决方案,但一些提示或概念。你知道吗


Tags: 文件samplenameprojectidphonecontentheader
2条回答

以下是psuedocode示例代码,根据我在注释中给出的逻辑,假设“InfoMap”是header的起点:

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)

您可以取消对print语句的注释以查看dataList包含的内容

另一个psedocode(或buggy real代码)。唯一的变化是您不将数据写入列表。你知道吗

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()

相关问题 更多 >