簡體   English   中英

比較兩個文件時如何確保兩個文件都保持打開狀態

[英]how to make sure both files remain open when comparing two files

我有兩個相當大的文件,每個文件都包含(開始,結束)信息的間隔列表。 我必須在第一個文件中輸出包含不與第二個文件中的間隔重疊的間隔的行,因為兩者之間有一定的共同點。

這是間隔不重疊的條件:

(start2 - end1) * (end2 - start1) < 0    TRUE

這是我的第一個測試文件(制表符分隔)。 在此文件中,列[8]是(開始+ 1),可以通過將列[5]中指示的長度添加到起始值來計算結束。

TagO    XXXX    xxxx    46  a   36  +   chrX    131072906   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr5    24260   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr8    93179690    0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228757224   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228759444   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228752768   0   36M 36
TagX    XXXX    xxxx    46  a   36  +   chr1    14355   0   36M 36
TagX    XXXX    xxxx    46  a   36  +   chr1    24260   0   36M 36
TagX    XXXX    xxxx    46  a   36  +   chr1    26320   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228766167   0   36M 36

第二個測試文件(制表符分隔)指示不良間隔的開始和結束:

chr1    14361   14408
chr1    16713   16749
chr1    18907   19048
chr1    19972   20405
chr1    20531   20679
chr1    21949   22075
chr1    23804   24038
chr1    24088   24250
chr1    24255   24448
chr1    26356   26412

輸出應該看起來像這樣(TagX與第二個文件中的間隔重疊,因此應該消失,但僅當file1中的列[7]和file2中的[0]包含相同的字符串時):

TagO    XXXX    xxxx    46  a   36  +   chrX    131072906   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr5    24260   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr8    93179690    0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228757224   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228759444   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228752768   0   36M 36
TagO    XXXX    xxxx    46  a   36  +   chr1    228766167   0   36M 36

這是我的代碼...

import sys

A = sys.argv[1]
B = sys.argv[2]

soap = open(A, 'r')
bed = open(B, 'r')

with soap as input1:
    for row1 in input1:
        chrom1 = row1.strip().split()[7]
        start1 = int(row1.strip().split()[8]) - 1
        end1 = start1 + int(row1.strip().split()[5])

        with bed as input2:
            for row2 in input2:
                chrom2 = row2.strip().split()[0]

                if chrom1 == chrom2:
                    start2 = int(row2.strip().split()[1])
                    end2 = int(row2.strip().split()[2])
                    test = (start2 - end1)*(end2 - start1)

                    if test < 0:
                        print row1.strip()

然后在終端機(Mac OS X)中使用以下命令運行它:

python remove.py file1.txt file2.txt > test_out.txt 

但我收到以下錯誤消息:

Traceback (most recent call last):
  File "remove.py", line 16, in <module>
    with bed as input2:
ValueError: I/O operation on closed file

“ bed”的with塊在塊完成后關閉文件。 但是通常情況下,您可以將open函數調用嵌入with語句中,如下所示:

with open(B, 'r') as input2

相反,你打開的文件只有一次,然后嘗試在它與操作with多次,你內部for循環。 因此python抱怨該文件對象僅被打開了一次,但是您試圖重復使用它。

如果您希望每次通過for循環都從input2的開頭開始,則可以將上述open函數調用嵌入到with語句中。

您也可以完全不使用“ with”語法(手動打開和關閉文件),或者可以移動第二個“ with”以包含for循環而不是將其包含在其中,然后使用seek()返回到循環的開始。

如果文件很小,則在完全進入for循環之前,僅將內容讀入內存(例如,列表),然后僅對列表進行迭代,這樣可能會更有效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM