我有一个非常大的(~8 GB)文本文件,它有很长的行。我想在这个文件的选定范围内拉出行,并将它们放在另一个文本文件中。事实上,我的问题与this和this非常相似,但当我尝试选择一系列行而不是一行时,我一直陷入困境。
到目前为止,这是我开始工作的唯一方法:
lines = readin.readlines()
out1.write(str(lines[5:67]))
out2.write(str(lines[89:111]))
然而,这给了我一个列表,我想输出一个格式与输入文件相同的文件(每行一行)
答案 0 :(得分:4)
您可以在范围内呼叫加入。
lines = readin.readlines()
out1.write(''.join(lines[5:67]))
out2.write(''.join(lines[89:111]))
答案 1 :(得分:2)
我可能建议不按照你的一个链接存储整个文件(因为它很大)吗?
f = open('file')
n = open('newfile', 'w')
for i, text in enumerate(f):
if i > 4 and i < 68:
n.write(text)
elif i > 88 and i < 112:
n.write(text)
else:
pass
我还建议使用'with'而不是打开和关闭文件,但遗憾的是我不允许在这里升级到足够新版本的python :(。
答案 2 :(得分:1)
面对这样的问题时,首先要考虑的是避免一次将整个文件读入内存。 readlines()
会这样做,因此应避免采用特定方法。
幸运的是,我们在Python中有一个优秀的标准库itertools
。 itertools
有许多有用的功能,其中一个是islice
。 islice
迭代迭代(例如列表,生成器,类文件对象等)并返回包含指定范围的生成器:
itertools.islice(iterable, start, stop[, step])
创建一个从迭代中返回所选元素的迭代器。如果start不为零, 然后跳过迭代中的元素,直到达到开始。 之后,除非设置了步骤,否则将连续返回元素 高于一,导致项目被跳过。如果停止是无, 然后迭代继续,直到迭代器耗尽,如果有的话; 否则,它停在指定位置。与常规切片不同, islice()不支持start,stop或step的负值。 可用于从内部数据中提取相关字段 结构已经扁平化(例如,多行报告可能会 列出每三行的名称字段)
使用此信息以及str.join方法,您可以例如使用这个简单的代码提取第10-19行:
from itertools import islice
# Add the 'wb' flag if you use Windows
with open('huge_data_file.txt', 'wb') as data_file:
txt = '\n'.join(islice(data_file, 10, 20))
请注意,循环遍历文件对象时,换行符会从行中删除,因此您需要将 \ n 设置为加入字符。
答案 3 :(得分:0)
(部分答案)为了使您当前的方法有效,您必须逐行编写。例如:
lines = readin.readlines()
for each in lines[5:67]:
out1.write(each)
for each in lines[89:111]:
out2.write(each)
答案 4 :(得分:0)
path = "c:\\someplace\\"
打开2个文本文件。一个用于阅读,一个用于写作
f_in = open(path + "temp.txt", 'r')
f_out = open(path + output_name, 'w')
浏览输入文件的每一行
for line in f_in:
if i_want_to_write_this_line == True:
f_out.write(line)
完成后关闭文件
f_in.close()
f_out.close()