我正在尝试合并600个文本文件的集合,每行看起来像
Measurement title Measurement #1
ebv-miR-BART1-3p 4.60618701
....
evb-miR-BART1-200 12.8327289
每个文件中包含250行左右。每个文件都以这种方式格式化,具有相同的数据头。我想要做的是组合文件,使其看起来像这样
Measurement title Measurement #1 Measurement #2
ebv-miR-BART1-3p 4.60618701 4.110878867
....
evb-miR-BART1-200 12.8327289 6.813287556
我想知道在python中是否有一种简单的方法可以删除每个文件的第二列,然后将其附加到主文件中?我计划拉出每一行,然后使用正则表达式查找第二列,并将其附加到主文件中的相应行。有没有更高效的东西?
答案 0 :(得分:3)
这是当今桌面计算机的少量数据(大约150000个测量值) - 因此将所有内容保存在内存中并转储到单个文件将比另一个策略更容易。如果它不适合RAM,也许使用SQL会是一个很好的方法 - 但事实上,你可以创建一个单独的默认字典,其中每个元素都是一个列表 - 读取所有文件并将测量结果收集到此字典中,并将其转储到磁盘 -
# create default list dictionary:
>>> from collections import defaultdict
>>> data = defaultdict(list)
# Read your data into it:
>>> from glob import glob
>>> import csv
>>> for filename in glob("my_directory/*csv"):
... reader = csv.reader(open(filename))
... # throw away header row:
... reader.readrow()
... for name, value in reader:
... data[name].append(value)
...
>>> # and record everything down in another file:
...
>>> mydata = open("mydata.csv", "wt")
>>> writer = csv.writer(mydata)
>>> for name, values in sorted(data.items()):
... writer.writerow([name] + values)
...
>>> mydata.close()
>>>
答案 1 :(得分:0)
使用csv模块读取文件,创建测量名称字典,并使字典中的值成为文件中值的列表。
答案 2 :(得分:0)
我还没有评论权限,因此是一个单独的答案。
jsbueno的答案非常有效,只要您确定每个文件中都会出现相同的测量ID(顺序并不重要,但这些集应该相同!)。
在以下情况中:
file1:
measID,meas1
a,1
b,2
file2:
measID,meas1
a,3
b,4
c,5
你会得到:
outfile:
measID,meas1,meas2
a,1,3
b,2,4
c,5
而不是所需的:
outfile:
measID,meas1,meas2
a,1,3
b,2,4
c,,5 # measurement c was missing in file1!
我使用逗号而不是空格作为分隔符以获得更好的可见性。