如何使用Python阅读文件中的最后几行?

时间:2016-01-25 11:12:51

标签: python regex python-2.7

我正在阅读具有特定文件名的文件夹。我正在读取文件中的内容,但是如何读取文件中的特定行或最后6行?

GetClassName

有人可以建议我如何阅读特定行或文件中的最后6行吗?

3 个答案:

答案 0 :(得分:2)

我可以想到两种方法。如果你的文件不是太大,你可以只读取所有行,并只保留最后六行:

f = open(some_path)
last_lines = f.readlines()[-6:]

但这真的是蛮力。更聪明的是使用文件对象的seek()方法进行猜测:

file_size = os.stat(some_path).st_size  # in _bytes_, so take care depending on encoding
f = open(some_path)
f.seek(file_size - 1000)  # here's the guess. Adjust with expected line length
last_lines = f.readline()[-6:]

答案 1 :(得分:1)

要读取单个文件的最后6行,可以使用Python的file.seek移动到文件的末尾,然后读取剩余的行。您需要确定最大线路长度可能是多少,例如1024个字符。

seek命令首先用于移动到文件的末尾(不读取),tell用于确定文件中的位置(因为我们在最后,这将是长度)。然后它在文件中向后移动并读取行。如果文件很短,则读入整个文件。

import os 

filename = r"C:\Users\hemanth_venkatappa\Desktop\TEST\Language\test.txt"
back_up = 6 * 1024      # Go back from the end more than 6 lines worth.

with open(filename, "r") as f_input:
    f_input.seek(0, os.SEEK_END)
    backup = min(back_up, f_input.tell())
    f_input.seek(-backup, os.SEEK_END)
    print f_input.readlines()[-6:]

使用with可确保您的文件随后自动关闭。使用r前缀文件路径可以避免需要对文件路径进行双重反斜杠。

然后将其应用于您的目录walk并将结果写入单独的输出文件,您可以执行以下操作:

import os
import re

back_up = 6 * 256       # Go back from the end more than 6 lines worth

directory = r"C:\Users\hemanth_venkatappa\Desktop\TEST\Language"
output_filename = r"C:\Users\hemanth_venkatappa\Desktop\TEST\output.txt"

with open(output_filename, 'w') as f_output:
    for dirpath, dirnames, filenames in os.walk(directory): 
        for filename in filenames:
             if filename.startswith('VCALogParser_output'): 
                cur_file = os.path.join(dirpath, filename)
                with open(cur_file, "r") as f_input:
                    f_input.seek(0, os.SEEK_END)
                    backup = min(back_up , f_input.tell())
                    f_input.seek(-backup, os.SEEK_END)
                    last_lines = ''.join(f_input.readlines()[-6:])
                    try:
                        summary = ', '.join(re.search(r'(\d+ warning\(s\)).*?(\d+ error\(s\)).*?(\d+ scenarios\(s\))', last_lines, re.S).groups())
                    except AttributeError:
                        summary = "No summary"
                    f_output.write('{}: {}\n'.format(filename, summary))

答案 2 :(得分:0)

或者,基本上,使用for循环将行附加到数组,然后从数组中删除第n个项目,如:

array=[] f=open("file.txt","r") for lines in f:

array.append(f.readlines())

f.close() while len(array) > 5:

del array[0]