Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 选择和打印文本文件的特定行_Python_File_Line - Fatal编程技术网

Python 选择和打印文本文件的特定行

Python 选择和打印文本文件的特定行,python,file,line,Python,File,Line,我有一个非常大(~8GB)的文本文件,它有很长的行。我想在这个文件的选定范围内拉出行,并将它们放在另一个文本文件中。事实上,我的问题与和非常相似,但当我试图选择一系列行而不是一行时,我总是被卡住 到目前为止,这是我唯一的工作方法: lines = readin.readlines() out1.write(str(lines[5:67])) out2.write(str(lines[89:111])) 然而,这给了我一个列表,我想输出一个与输入文件格式相同的文件(每行一行)(部分答案)为了使您

我有一个非常大(~8GB)的文本文件,它有很长的行。我想在这个文件的选定范围内拉出行,并将它们放在另一个文本文件中。事实上,我的问题与和非常相似,但当我试图选择一系列行而不是一行时,我总是被卡住

到目前为止,这是我唯一的工作方法:

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))