我有一个文件,其中包含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)
有什么想法解决这个问题吗?
非常感谢!
答案 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()导入列表中的所有行。如果内存问题仍然存在,请告诉我。