[英]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.