选择并打印特定行的文本文件

时间:2010-08-24 16:59:36

标签: python file line

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

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

lines = readin.readlines()
out1.write(str(lines[5:67]))
out2.write(str(lines[89:111]))

然而,这给了我一个列表,我想输出一个格式与输入文件相同的文件(每行一行)

5 个答案:

答案 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中有一个优秀的标准库itertoolsitertools有许多有用的功能,其中一个是isliceislice迭代迭代(例如列表,生成器,类文件对象等)并返回包含指定范围的生成器:

  

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