【问题标题】:I need to split a very large text file我需要拆分一个非常大的文本文件
【发布时间】:2017-09-18 18:00:01
【问题描述】:

我有一个大文本文件(比我的 RAM 还多),我需要使用其中的每一行进行进一步处理。但是,如果我一次读到 4096 个字节,我担心会在两者之间的某处分割线。我该如何进行?

【问题讨论】:

  • 您可以一次读取一个字符,直到偶然发现一个换行符(\n\r\n),然后将换行之前的数据写入另一个文件。
  • 不会让处理速度慢很多吗?
  • 或以块的形式读取数据并扫描这些数据以查找新行,然后查看该块是否以新行结尾。如果没有,并且要从文件中读取更多数据,请执行此操作并将新块与前一个块的其余部分连接起来。然后重复这个过程。
  • 某些行是否超出了您可以用于此任务的内存大小?
  • 如果是文本文件,一次读取一行,将每一行添加到列表中。您可以通过将每个字符的长度添加到累加器来跟踪已读取的字符数,但请事先检查是否该处理“块”。

标签: python file-handling


【解决方案1】:

您可以这样做:

SIZE = 1024

with open('file.txt') as f:
    old, data = '', f.read(SIZE)

    while data:
          # (1)
        lines = data.splitlines()
        if not data.endswith('\n'):
            old = lines[-1]
        else:
            old = ''

        # process stuff

        data = old + f.read(SIZE)
  1. 如果您执行data.splitlines(True),则换行符将保留在结果列表中。

【讨论】:

    【解决方案2】:

    在 Linux 上:

    把这个放到python脚本中,例如process.py

    import sys
    
    for line in sys.stdin:
        #do something with the line, for example:
        output = line[:5] + line[10:15]
        sys.stdout.write("{}\n".format(output))
    

    要运行脚本,请使用:

    cat input_data | python process.py > output
    

    【讨论】:

      【解决方案3】:

      使用生成器读取文件:

      def read_file(file_path):
          with open(file_path, 'r') as lines:
              for line in lines:
                  yield line
      

      这样你一次不会有超过一行的内存,但仍会按顺序读取文件。

      【讨论】:

      • 我担心一行会超出我的记忆...我什至无法正常打开文件检查...
      • 谢谢...如果我确定一行是固定长度的,这是一个很好的解决方案...
      • yield 在这里没有添加任何值... {{for line in lines}},调用文件迭代器..它已经在内存中逐行加载数据...你可以这样做: {{for line in lines: doSomethingWithThisLine()}} 函数并使用它
      【解决方案4】:

      在文件可能很大的音频编码批次中会做这种事情。据我了解,通常的方法是拥有一个内存缓冲区并分两个阶段执行:将任意大小的 blob 读入缓冲区(4096 或其他),然后从缓冲区中流式传输字符,对行尾做出反应。因为缓冲区在 ram 中,所以逐个字符地流出缓冲区是很快的。我不确定在 Python 中最好使用哪种数据结构或调用,我实际上只在 C 中完成了这个,它只是一个 ram 块。但同样的方法也应该奏效。

      【讨论】:

      • 谢谢...我只是个初学者,第一次处理这么大的数据...
      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多