首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较具有长列表的两个文件,以获取公共元素和相邻信息

比较具有长列表的两个文件,以获取公共元素和相邻信息
EN

Stack Overflow用户
提问于 2012-12-12 17:16:35
回答 3查看 651关注 0票数 0

我有两个大文件。文件A看起来像这样:

代码语言:javascript
复制
SNP_A-1780270 rs987435 7 78599583 - C G
SNP_A-1780271 rs345783 15 33395779 - C G
SNP_A-1780272 rs955894 1 189807684 - G T
SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T

..。有950,000行。

文件B看起来像这样:

代码语言:javascript
复制
SNP_A-1780274
SNP_A-1780277
SNP_A-1780278
SNP_A-1780283
SNP_A-1780285
SNP_A-1780286
SNP_A-1780287

..。有90万行。

我需要在第1列的文件A中找到文件B的公共元素,并获得如下输出文件:

代码语言:javascript
复制
SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T

我怎样才能在Python中以最有效的方式做到这一点呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-12 17:36:27

如果文件A的行与"key“列1相比很长,您可以尝试这种方法:

代码语言:javascript
复制
positions = {}
with open('fileA.txt') as fA:
    pos = 0
    for lineA in fA:
        uid = lineA.split(' ')[0] #gets SNP_A-1780270
        positions[uid] = pos
        pos += len(lineA)
with open('fileB.txt') as fB, open('fileA.txt') as fA, open('fileC.txt', 'w') as out:
    for lineB in fB:
        pos = positions[lineB.strip()]
        fA.seek(pos)
        lineA = fA.readline()
        out.write('%s\n', lineA)

您应该检查是pos += ...更可靠还是file.tell()更可靠。我想,因为bufferin也参与其中。file.tell()无法工作,但可能是pos += ...也需要重新调整。

与dict版本相比,这需要更少的内存,但由于处理文件A,可能会更慢。

票数 0
EN

Stack Overflow用户

发布于 2012-12-12 17:28:04

我认为字典是最理想的:

代码语言:javascript
复制
>>> sa = """SNP_A-1780270 rs987435 7 78599583 - C G
SNP_A-1780271 rs345783 15 33395779 - C G
SNP_A-1780272 rs955894 1 189807684 - G T
SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T"""
>>> dict_lines = {}
>>> for line in sa.split('\n'):
    dict_lines[line.split()[0]] = line


>>> sb = """SNP_A-1780274
SNP_A-1780277
SNP_A-1780278
SNP_A-1780283
SNP_A-1780285
SNP_A-1780286
SNP_A-1780287"""
>>> for val in sb.split('\n'):
    line = dict_lines.get(val, None)
    if line:
        print line


SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T
票数 2
EN

Stack Overflow用户

发布于 2012-12-13 12:05:44

如果您可以从Python代码中调用join filea fileb > filec,那么它将为您提供所需的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13836403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档