Python 选择和打印文本文件的特定行
我有一个非常大(~8GB)的文本文件,它有很长的行。我想在这个文件的选定范围内拉出行,并将它们放在另一个文本文件中。事实上,我的问题与和非常相似,但当我试图选择一系列行而不是一行时,我总是被卡住 到目前为止,这是我唯一的工作方法:Python 选择和打印文本文件的特定行,python,file,line,Python,File,Line,我有一个非常大(~8GB)的文本文件,它有很长的行。我想在这个文件的选定范围内拉出行,并将它们放在另一个文本文件中。事实上,我的问题与和非常相似,但当我试图选择一系列行而不是一行时,我总是被卡住 到目前为止,这是我唯一的工作方法: lines = readin.readlines() out1.write(str(lines[5:67])) out2.write(str(lines[89:111])) 然而,这给了我一个列表,我想输出一个与输入文件格式相同的文件(每行一行)(部分答案)为了使您
lines = readin.readlines()
out1.write(str(lines[5:67]))
out2.write(str(lines[89:111]))
然而,这给了我一个列表,我想输出一个与输入文件格式相同的文件(每行一行)(部分答案)为了使您当前的方法有效,您必须逐行写入。例如:
lines = readin.readlines()
for each in lines[5:67]:
out1.write(each)
for each in lines[89:111]:
out2.write(each)
您可以在范围上调用join
lines = readin.readlines()
out1.write(''.join(lines[5:67]))
out2.write(''.join(lines[89:111]))
我是否可以建议不要按照您的链接存储整个文件(因为它很大)
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
f=open('file'))
n=打开('newfile','w')
对于i,枚举(f)中的文本:
如果i>4且i<68:
n、 书写(文本)
如果i>88且i<112:
n、 书写(文本)
其他:
通过
我还建议使用“with”而不是打开和关闭文件,但遗憾的是,我不允许升级到足够新的python版本来实现这一点:(
打开两个文本文件。一个用于读取,一个用于写入
检查输入文件的每一行
完成后关闭文件
当遇到这样的问题时,首先要考虑的是避免将整个文件一次读入内存。
readlines()
会这样做,因此应该避免使用特定的方法
幸运的是,我们有一个优秀的Python标准库。itertools
有很多有用的函数,其中之一就是。islice
迭代iterable(例如列表、生成器、类似文件的对象等),并返回包含指定范围的生成器:
itertools.islice(iterable,start,stop[,step])
生成一个迭代器,从iterable返回所选元素。如果start为非零,
然后,将跳过iterable中的元素,直到到达开始位置。
之后,除非设置了步骤,否则将连续返回元素
大于一,导致项目被跳过。如果停止为无,
然后迭代继续,直到迭代器耗尽(如果有的话);
否则,它将停止在指定位置。与常规切片不同,
islice()不支持开始、停止或步骤的负值。
可用于从内部
结构已展平(例如,可能会出现多行报告)
每三行列出一个名称字段)
使用此信息和方法,您可以使用以下简单代码提取第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设置为连接字符。它应该是out1.write(“”.join(行[5:67]))out2也是如此,因为readlines不会删除行尾。这不应该是公认的答案——除非有很好的理由,否则不能将8GB的数据读入内存。
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()
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))