我正在阅读具有特定文件名的文件夹。我正在读取文件中的内容,但是如何读取文件中的特定行或最后6行?
GetClassName
有人可以建议我如何阅读特定行或文件中的最后6行吗?
答案 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]