2014-05-06 36 views
0

這個問題有兩個方面: 背景:我有2個大文件,文件1的每一行是「AATTGGCCAA」,文件2的每一行是「AATTTTCCAA」。每個文件都有20000行,我有一個python代碼,我必須依次在每對行上運行。首先,你將如何着手讓Python代碼在每個文件的同一行號上運行,例如:這兩個文件的第1行? 其次,如何在第1行上運行後,讓文件在兩個文件中向下移動到第2行?使python程序逐行同步讀取2個文件並在每行上執行程序

回答

3

文件對象是迭代器。你可以將它們傳遞給任何期望可迭代對象的函數,它將起作用。對於您的特定用例,您希望使用zip內置函數,它並行地遍歷多個對象,並從每個迭代中產生具有一個對象的元組。

with open(filename1) as file1, open(filename2) as file2: 
    for line1, line2 in zip(file1, file2): 
     do_something(line1, line2) 

在Python 3 zip是一個迭代,所以這是有效的。如果您需要在Python 2中執行相同的操作,則可能需要使用itertools.izip,因爲常規的zip會導致將這兩個文件中的所有數據先讀入列表中。

+0

+1。我發佈了[對任意數量文件的回答的泛化](http://stackoverflow.com/a/23505739/4279)。雖然在這種情況下沒有必要。 – jfs

0

文件對象是迭代器。您可以打開它們,然後在該對象上調用.next()以獲取下一行。一個例子

For line in file1: 
    other_line = file2.next() 
    do_something(line, other_line) 
0

下面的代碼使用兩個Python特徵:
1.發電機用作迭代

def get_line(file_path): 
# Generator function 
    with open(file_path) as file_obj: 
     for line in file_obj: 
      # Give one line and return control to the calling scope 
      yield line 

# Generator function will not be executed here 
# Instead we get two generator instances 
lines_a = get_line(path_to_file_a) 
lines_b = get_line(path_to_file_b) 
while True: 
    try: 
     # Now grab one line from each generator 
     line_pair = (next(lines_a), next(lines_b)) 
    except StopIteration: 
     # This exception means that we hit EOF in one of the files so exit the loop 
     break 
     do_something(line_pair) 

假設代碼是包裹在do_something(line_pair)功能處理
2.文件對象,該對象接受長度爲2的元組,該元組保存這對線。

+0

感謝您的支持!這一切都有道理,但我想知道哪個文件路徑應該放在腳本的第1行和第3行中?由於這兩個文件都是在第11行和第12行中調用的,所以我不太瞭解這部分。很高興瞭解發生器和迭代器。 – thh32

+0

也許我沒有說清楚。你保持第1行和第3行完整 - 變量'file_path'應該保持原樣。在第11和12行中,您將路徑傳遞給您的文件。 – ElmoVanKielmo

+0

這裏不需要'get_line'生成器。文件對象已經是一個迭代器,所以你可以簡單地調用'next'。 – Blckknght

0

下面是允許用戶從多個文件處理的同步行的代碼:

from contextlib import ExitStack 

with ExitStack() as stack: 
    files = [stack.enter_context(open(filename)) for filename in filenames] 
    for lines in zip(*files): 
     do_something(*lines) 

例如,對於2個文件它調用do_something(line_from_file1, line_from_file2)對於每對在給定的文件的行。