【问题标题】:How to read a specific portion of a txt file in Python?如何在 Python 中读取 txt 文件的特定部分?
【发布时间】:2019-11-16 07:38:34
【问题描述】:

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

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

  • 文件以 STARTINGWORK 开头并以文本行结尾。
    我需要在最后一个 STARTINGWORK 之后提取最终文本部分,不带 STARTINGWORK str

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

     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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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 包含所需的行。

    【讨论】:

    • 当我尝试这个时,除了 OSError 之外它还给我。我正在使用尝试,除了验证文件的路径。
    • 我把文件名改成了records.txt
    • 如果我打印部分,我会得到全文:/
    • 它对我来说很好用。 STARTING WORKING之前可能有一个字符。您可以制作小的虚拟文本文件,然后尝试上面的代码并进行调试。
    • 它工作,在 txt 文件中拼写错误('STARTINGWORKING')。唯一剩下的是我需要在这部分上去掉 \n ,但这没什么大不了的!谢谢
    【解决方案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
    

    【讨论】:

    • 这不适用于超过 2 个 STARTWORKING。在文本中实际上可以有2个,但可以随机增加。所以目标是在最后一个 STARTINGWORK 之后到达最后一行
    • @BenjamínSerra 为什么现在不能工作?你真的试过了吗?
    • @BenjamínSerra 行:open(file).read().split('STARTINGWORK') 将列出每次出现“STARTINGWORK”之间的所有文本部分。然后你可以简单地取出该列表中的最后一个元素,而 Akaisteph7 的其余代码只是正确删除日期和时间。
    • @BenjamínSerra 如果您的问题得到解决,请标记正确答案。
    • @Akaisteph7 是的,我正在尝试使用此代码。但是仍然无法正常工作,如果我使用extracted_text,我会得到整个文本或数字22 51。我不知道我做错了什么:/
    【解决方案3】:

    我会采取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 ...'
    

    【讨论】:

    • print(result.group(1)) AttributeError: 'NoneType' 对象没有属性 'group'
    • 这项工作比其他答案更好更简单。谢谢!
    • @GUNTERSAMA 很高兴您找到了解决方案,但我认为这并不简单..
    【解决方案4】:

    get_final_lines 生成器试图避免 mallocing 比需要更多的存储空间, 在读取一个可能很大的文件时。

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

    【讨论】:

      【解决方案5】:

      您可以有一个变量来保存自上次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之后的所有内容,如果你想删除初始的STARTINGWORK,你可以保留result [1:]

      - 然后在代码中:

      #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:]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多