【问题标题】:Python: Comparing numbers in two filesPython:比较两个文件中的数字
【发布时间】:2015-10-21 21:44:51
【问题描述】:

在与 python 中断太久之后,我又回到了 python,现在我正在努力做一个简单的任务,将文件 A 中的数字与文件 B 中的所有数字进行比较,循环文件 A 以执行每个数字每一行。编号是文件 A 在第 2 列中(由 \t 分割),并且要返回的这些数字必须大于 exonStart(文件 B 的第 4 列)并且小于 exonStop(文件 B 的第 5 列)。最终我想将这些行(附加到行的文件 A 的完整行是与该参数匹配的文件 B)写入一个新文件。

fileA (trimmed for relevant info and truncated):
    1       10678   12641
    1       14810   14929 
    1       14870   14969  

fileB (trimmed for relevant info and truncated):
    1       processed_transcript    exon    10000   12000  2
    1       processed_transcript    exon    10500   12000  2
    1       processed_transcript    exon    12613   12721  3     
    1       processed_transcript    exon    14821   14899  4

我的代码尝试更详细地解释代码。

f = open('fileA')
f2 =open('fileB')

for line in f:
    splitLine= line.split("\t")
    ReadStart= int(splitLine[1])
    print ReadStart
    for line2 in f2:
        splitLine2=line2.split("\t")
        ExonStart = int(splitLine2[3])
        ExonStop = int(splitLine2[4])
        if ReadStart < ExonStop and ReadStart > ExonStart:
            print ReadStart, ExonStart, ExonStop
        else:
            print "BOO"   
f.close()

我期望的是(来自我的代码): 其中第一个 col 是文件 B 中的 ReadStart,接下来的两个来自文件 A

    10678   10000   12000
    10678   10500   12000
    14870   14821   14899

我的代码只会返回第一行。

【问题讨论】:

  • 很高兴看到您的一些输出或您的期望与实际发生的情况
  • 您能否为运行代码的代码提供输入?
  • 这些文件有多大?
  • @RNar 希望为您提供了足够的信息。
  • @skrrgwasme 目前正在处理小文件,但将把文件 A 放大到 400M 文件,文件 B 大约 30M 文件。我可以修剪文件 A 以删除不相关的信息。您认为尺寸可能是个问题吗?

标签: python file loops


【解决方案1】:

也许问题就在这里:

splitLine2=line.split("\t")

如果你使用的是文件 2,那就是

splitLine2=line2.split("\t")

【讨论】:

  • 我注意到了,它仍然只返回第一行。我已调整我的问题以包含更多信息作为请求
【解决方案2】:

问题是你的文件指针。您在代码顶部打开文件 B,然后在处理文件 A 的第一行时一直遍历它。这意味着在外部循环的第一次迭代结束时,您的文件指针现在指向 文件B的结尾。在下一次迭代中,由于指针位于文件末尾,因此没有更多行可以从文件B读取,因此跳过了内部循环。

一种选择是在外循环结束时对文件 B 使用 seek 函数将文件指针重置到文件顶部:

f2.seek(0)

但是,我建议您改变方法,将文件 B 读入内存,这样您就不会一遍又一遍地读取文件:

# use context managers to open your files instead of file pointers for
# cleaner exception handling
with open('f2.txt') as f2:

    exon_points = []

    for line in f2:
        split_line = line.split() # notice that the split function will split on
                                  # whitespace by default, so "\t" is not necessary

        # append a tuple of the information we care about to the list
        exon_points.append(((int(split_line[3]), int(split_line[4]))))

with open('f1.txt') as f1:

    for line in f1:
        read_start = int(line.split()[1])  

        for exon_start, exon_stop in zip(exon_starts, exon_stops):

            if read_start < exon_stop and read_start > exon_start:
                print("{} {} {}".format(read_start, exon_start, exon_stop))

             else:
                 print("BOO")

输出:

10678 10000 12000
10678 10500 12000





14830 14821 14899



14870 14821 14899

【讨论】:

  • 难道 zip 不能使文件 A 的第 1 行仅与文件 B 的第 1 行进行比较吗?您会得到正确的输出,因为对于截断的数据,第 1 行与第 1 行匹配,第 3 行与第 3 行匹配。
  • 完全正确。这不是你要找的吗?我不太完全理解您对您正在寻找的内容的书面解释,因此我专注于您的示例输出并尝试与之匹配。
  • @George 您是否在第二个文件中为第一个文件中的每一行查找 all 匹配项?
  • 我只是给你写一个解释,让你评论罗伯茨解决方案。我想我可能一路上误导了你。我正在尝试在文件 B 中找到与文件 A 中每一行的参数匹配的行。因此,从文件 A 中获取第 1 行,搜索文件 B 中的匹配项打印它们。然后为文件 A 搜索文件 B 等执行第 2 行。所以是的。很抱歉让您感到困惑,我需要学会更清楚地写出我的问题。
  • 这个问题本身还不错。你有关键点:你的代码、你的预期结果和你观察到的结果。预期结果部分中的示例可能更完整,包括一个示例行,说明文件 A 中的一行可能在文件 B 中有多个匹配项。此外,我将转储您对未来计划的最后一部分-即几乎使问题过于宽泛,因为它主要是关于调试现有代码的问题。如果没有一个过长的答案或为您编写代码,就很难解决这部分问题。
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 2014-07-29
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多