2

我正在尝试合并 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中是否有一种简单的方法可以去除每个文件的第二列,然后将其附加到主文件中?我计划将每一行都拉出,然后使用正则表达式查找第二列,并将其附加到主文件中的相应行。有什么更有效的吗?

4

3 回答 3

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()
>>> 
于 2013-05-31T16:19:40.560 回答
0

使用 csv 模块读取文件,创建测量名称字典,并使字典中的值成为文件中值的列表。

于 2013-05-31T16:16:34.983 回答
0

我还没有评论权限,因此单独回答。

只要您确定每个文件中都出现相同的测量 ID(顺序不重要,但集合应该相等!),jsbueno 的答案就非常有效。

在以下情况下:

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!

我使用逗号而不是空格作为分隔符以获得更好的可见性。

于 2013-05-31T17:00:29.553 回答