基于第n列中的值拆分无序的csv文件/

2024-10-02 10:23:21 发布

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

我有一个很大的csv文件,里面有代表不同物种的病原体样本信息。我想按物种分割这个csv文件,所以每个物种都有一个csv文件。文件中的数据没有任何特定的顺序。我的csv文件如下所示:

maa_2015-10-07_15-15-16_5425_manifest.csv,NULL,ERS044420,EQUI0208,1336,Streptococcus equi,15/10/2010,2010,Belgium,Belgium
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852528,2789STDY5834916,154046,Hungatella hathewayi,2013,2013,United Kingdom,UK
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852530,2789STDY5834918,33039,Ruminococcus torques,2013,2013,United Kingdom,UK
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852533,2789STDY5834921,40520,Blautia obeum,2013,2013,United Kingdom,UK
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852535,2789STDY5834923,1150298,Fusicatenibacter saccharivorans,2013,2013,United Kingdom,UK
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852537,2789STDY5834925,1407607,Fusicatenibacter,2013,2013,United Kingdom,UK
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852540,2789STDY5834928,39492,Eubacterium siraeum,2013,2013,United Kingdom,UK
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852544,2789STDY5834932,292800,Flavonifractor plautii,2013,2013,United Kingdom,UK
maa_2015-09-28_13-07-45_0098_manifest.csv,NULL,ERS852551,2789STDY5834939,169435,Anaerotruncus colihominis,2013,2013,United Kingdom,UK
maa_2015-10-07_15-15-16_5425_manifest.csv,NULL,ERS044418,EQUI0206,1336,Streptococcus equi,05/02/2010,2010,Belgium,Belgium
maa_2015-10-07_15-15-16_5425_manifest.csv,NULL,ERS044419,EQUI0207,1336,Streptococcus equi,29/07/2010,2010,Belgium,Belgium

该物种的名称在索引5处。在

我最初尝试过:

^{pr2}$

但是这失败了,因为数据不是按种类排序的,而且输出也没有附加参数(我知道),所以每当脚本遇到一个新的物种条目,它已经写入了一个文件,它就会覆盖第一个条目。在

有没有一种简单的方法可以按种类对数据排序,然后执行上面的脚本,或者将上面脚本的输出附加到一个文件中而不是覆盖它?在

我也希望每个输出文件都以它们所包含的物种命名。在

谢谢。在


Tags: 文件csv数据脚本物种nullunitedkingdom
2条回答

您可以使用与groupby operation相同的lambda函数对csv文件进行排序:

import csv
from itertools import groupby

groupfunc = lambda row: row[5]

for key, rows in groupby(sorted(csv.reader(open("file.csv")),key=groupfunc),groupfunc):
    with open("%s.csv" % key, "w") as output:
        cw = csv.writer(output)
        cw.writerows(rows)

注:

  1. 我重写了write例程以使用csv模块作为输出
  2. 我为你的lambda创建了一个变量,所以没有复制粘贴

请注意,如果更改输入数据,则必须清理csv文件,因为如果新数据中没有一个物种,则旧的csv仍保留在磁盘上。我想用一些代码,比如:

^{pr2}$

但是要小心*.csv模式,因为它太宽了,而且可能对其他csv文件太有效了:)

注意:这种方法使用sort,因此更需要内存。您可以选择在附加模式下打开每个文件,而不是像其他解决方案建议的那样,以节省内存,但执行更多的文件I/O

关于您的评论:“输出没有附加参数(我知道)”,您可以使用“a”而不是“w”来附加到文件,如下所示:

with open("%s.csv" % key, "a")

可能不是最好的方法,因为如果你运行代码两次,你会得到双倍的结果。在

相关问题 更多 >

    热门问题