SIGKILL在一个简单的python脚本中添加列

时间:2016-08-11 11:33:23

标签: python file-processing

我有一个文件,其中包含oneline标头和带有值的长列。我想添加第二列,其值为10981(步骤= 1),直到文件结束(当然,省略标题)。问题是脚本需要大量内存而我的电脑崩溃,可能是由于脚本编写得不好(抱歉,我是新编程的!)。 我所做的脚本是:

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)

当我运行它时我的PC崩溃,我尝试在pycharm中测试它时出现以下错误,我所看到的可能是由于内存不足:

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

有什么想法解决这个问题吗?

非常感谢!

2 个答案:

答案 0 :(得分: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 :(得分: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)

----更新:关注Rory 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()导入列表中的所有行。如果内存问题仍然存在,请告诉我。