如何在Python中读取txt文件的特定部分?

时间:2019-07-05 17:09:04

标签: python python-3.x file for-loop readlines

我需要从txt文件中提取一部分文本。
该文件如下所示:

STARTINGWORKIN DD / MM / YYYY HH:MM:SS
...文字行...
...更多文字行...
开始工作DD / MM / YYYY HH:MM:SS
...我想要的文字行...
...更多我想要的文字行...

  • 文件以STARTINGWORK开头,以文本行结尾。
    我需要提取最后一个STARTINGWORK之后的最终文本部分,而没有STARTINGWORK str

我尝试使用3个循环(一个开始,另一个读取行之间,最后一个结束)

     file = "records.txt"
     if file.endswith (".txt"):
       if os.path.exists (file):
         lines = [line.rstrip ('\ n') for line in open (file)]
         for line in lines:
             #extract the portion

5 个答案:

答案 0 :(得分:2)

尝试一下:

file = "records.txt"
extracted_text = ""
    if file.endswith (".txt"):
        if os.path.exists (file):
            lines = open(file).read().split("STARTINGWORKING")
            extracted_text = lines[-1] #Here it is

答案 1 :(得分:2)

您可以使用file_read_backwards模块从头到尾读取文件。如果文件很大,可以帮助您节省时间:

from file_read_backwards import FileReadBackwards

with FileReadBackwards("records.txt") as file:
    portion = list()
    for line in file:
         if not line.startswith('STARTINGWORKING'):
            portion.append(line)
         else:
            break
portion.reverse()

portion包含所需的行。

答案 2 :(得分:1)

我将采取regex的路径来解决此问题:

>>> import re
>>> input_data = open('path/file').read()
>>> result = re.search(r'.*STARTINGWORKING\s*(.*)$', input_data, re.DOTALL)
>>> print(result.group(1))
#'DD / MM / YYYY HH: MM: SS\n... text lines I want ...\n... more text lines that I want ...'

答案 3 :(得分:0)

get_final_lines生成器尝试避免malloc出现 多余的存储空间, 同时读取可能很大的文件。

def get_final_lines(fin):
    buf = []
    for line in fin:
        if line.startswith('STARTINGWORK'):
            buf = []
        else:
            buf.append(line)

    yield from buf


if __name__ == '__main__':
    with open('some_file.txt') as fin:
        for line in get_final_lines(fin):
            print(line.rstrip())

答案 4 :(得分:0)

您可以使用一个变量来保存自上一个STARTINGWORK以来所有已读取的行。
完成文件处理后,您便拥有了所需的内容。

当然,您不需要先阅读列表中的所有行。您可以直接在打开的文件中读取它,并且一次返回一行。 即:

result = []
with open(file) as f:
    for line in f:
        if line.startswith("STARTINGWORK"):
            result = []       # Delete what would have accumulated
        result.append(line)  # Add the last line read
print("".join(result))

result中,您拥有上一个STARTINGWORK之后的所有内容(包括首尾两字),如果您想删除首个result [1:]

,则可以保留STARTINGWORK

-然后在代码中:

#list
result = []

#function
def appendlines(line, result, word):
  if linea.startswith(word):
    del result[:]
  result.append(line)
  return line, result

with open(file, "r") as lines: 
  for line in lines:              
    appendlines(line, result, "STARTINGWORK")
new_result = [line.rstrip("\n") for line in result[1:]]