2016-08-11 46 views
3

我有,有一個ONELINE頭和長柱值的文件中添加列。我想添加自10981(step = 1)以來的第二列,直到文件結尾(當然,省略標題)。問題是,該腳本需要大量的內存和我的電腦死機,可能是由於腳本沒有很好地做(不好意思,我是新的編程!)。 ,我已經做了該腳本是這樣的:SIGKILL在一個簡單的Python腳本

with open ('chr1.phyloP46way.placental2.wigFix', 'w') as file_open: 
    num = 10981 
    text = file_open.readlines() 
    next (text) 
    for line in text: 
     num = num + 1 
     print line.strip() + '\t' + str(num) 

由於我的電腦死機當我運行它,我想測試它與下面的錯誤pycharm,大概就是我所看到的是,由於內存不足:

Process finished with exit code 137 (interrupted by signal 9: SIGKILL) 

任何想法來解決這個問題?

非常感謝!

+0

歡迎來到SO!請更正代碼的格式,以便我們不必假定塊有多遠。最簡單的方法通常是粘貼代碼,全選,然後單擊代碼格式按鈕(看起來像'{}')。另外,如果腳本本身崩潰,請提供回溯。 – glibdud

回答

3

如果你的系統運行資源不足,可能的罪魁禍首是readlines()通話,這將導致Python來嘗試將整個文件加載到內存中。沒有必要這樣做......文件對象本身可以用作迭代器來逐行讀取文件:

with open ('chr1.phyloP46way.placental2.wigFix', 'w') as file_open: 
    num = 10981 
    next (file_open) 
    for line in file_open: 
     num = num + 1 
     print line.strip() + '\t' + str(num) 
1

這是很難驗證它是否工作不帶.txt,但給一個嘗試到一個

f = open(os.path.join(data_path, 'chr1.phyloP46way.placental2.wigFix'), 'r') 
lines = f.readlines() 
num = 10981 

for line_num in range(len(lines)): 

    line_in = lines[line_num] 

    num = num + 1 
    print line_in.strip() + '\t' + str(num) 

----更新:下面的羅裏Daulton評論

我有一些時間做一個小測試。也許這個人會有所幫助: 保存下面的代碼在一個名爲converter.py

import os 

def add_enumeration(data_path, filename_in, filename_out, num=10981): 

    # compose the filenames: 
    path_to_file_in = os.path.join(data_path, filename_in) 
    path_to_file_out = os.path.join(data_path, filename_out) 

    # check if the input file exists: 
    if not os.path.isfile(path_to_file_in): 
     raise IOError('Input file does not exists.') 

    # open the files: 
    # if f_out does not exists it will be created. 
    # if f_out is not empty, content will be deleted 
    f_in = open(path_to_file_in, 'r') 
    f_out = open(path_to_file_out, 'w+') 

    # write the first line of the file in: 
    f_out.write(f_in.readline()) 

    for line_in in f_in: 

     f_out.write(line_in.strip() + ' ' + str(num) + '\n') 
     num = num + 1 

    f_in.close() 
    f_out.close() 

然後從IPython的終端文件:

In: run -i converter.py 

In: add_enumeration('/Users/user/Desktop', 'test_in.txt', 'test_out.txt') 

注意,如果TEST_OUT不是空的,它的內容將是刪除。 這應該避免使用readlines()導入列表中的所有行。讓我知道如果內存問題仍然存在。

+1

由於OP說,他有內存問題,在整個文件怎麼會讀取一次解決他的問題? –

+0

Ops ...讓我想想..! – SeF

+0

編輯無盡的號碼後,現在它避免了.readlines(),它分析所有的行到一個列表。 – SeF