【问题标题】:Python: Is there a better way for read()?Python:read() 有更好的方法吗?
【发布时间】:2017-03-24 22:46:10
【问题描述】:

在下面的代码中,我将创建一个临时文件,然后将一个 txt 文件的全部内容保存在这个临时文件中。这只是一个例子。我知道读取文本文件然后将其写入临时文件是没有意义的。但我想证明我的问题。

好吧,当我使用 read() 方法时,这意味着临时文件的全部内容都保存在 RAM 内存中,对吧?我无法控制临时文件的内容大小。所以我在想是否有更好的方法来保护 RAM 内存。我不想淹没 RAM 内存。

# Use the TemporaryFile context manager for easy clean-up
with tempfile.TemporaryFile(delete=True) as tmp:
    with open('filename.txt', 'r') as my_file:
        for line in my_file:
            tmp.write(line)

    tmp.seek(0)

    exec(tmp.read())

【问题讨论】:

  • 代码与文字描述不符。你的实际任务是什么?您是想将文本文件作为 Python 代码执行(根据您的代码中的 exec(tmp.read()) 判断)还是要将一个文本文件的内容逐行复制到另一个文本文件中(根据您的代码中的 for line in file: output_file.write(line) 判断) .您的实际问题是什么?
  • @J.F.塞巴斯蒂安;你说得对。我想将文本文件作为 Python 代码执行。在这种情况下,代码保存在文本文件中。但稍后我会将文本文件保存在 Web 服务器上。我的程序访问文本文件,将其保存在临时文件中,然后执行。
  • 那你为什么要担心内存?你是在微控制器上运行它吗?有多少 RAM 可用?您不害怕从互联网上运行任意代码,但您担心代码太多?代码有什么作用?一次运行一行是否有意义(具有明确的命名空间)。如果您正在从网络读取数据;无论出于何种原因,您都可以随时停下来。
  • 我没有批评的意思。我了解如何您这样做(通过 http 获取文件,将其保存为临时文件,立即将其作为字符串读回,使用exec() 将其作为 Python 代码运行)。我不明白您要做什么(而不是如何)以及为什么您要这样做。您已经问过这个问题:“read() 的更好方法”——没有非常具体的上下文,不清楚您期望什么类型的答案。例如,为什么需要临时文件?您可以直接从网络读取并将size参数传递给.read(),以限制读取的总量。
  • 它看起来像 XY problem:您在问“如何在不消耗所有内存的情况下读取临时文件”(可能的答案是:使用 .read(limit) 而不是 .read() 或按行读取行或分块读取)。你应该问什么:“我如何在不消耗所有内存的情况下从网络读取 Python 代码”(你至少应该提到:为什么你认为你需要从网络读取代码以及是否需要一次执行所有代码或者例如,可以逐行执行代码吗?)。

标签: python-2.7


【解决方案1】:

for line in my_file 调用文件对象.next 其中does not buffer the entire file in memory when reading

为了使 for 循环成为最有效的循环方式 文件的行(一个非常常见的操作), next() 方法使用 隐藏的预读缓冲区

来自docs

为了从文件中读取行,你可以遍历文件对象。这 内存效率高,速度快,代码简单

对于tmp.read()函数,来自docs

当 size 被省略或为负时,文件的全部内容将 被阅读并返回;如果文件是两倍大,那是你的问题 作为你机器的内存。

因此,除非您像写入时那样逐行读取,或者read 以固定数量递增 tmp.read(100),否则您会将整个文件读入内存。

【讨论】:

  • 恐怕你还没有理解我的问题,因为我的重点是嵌套在 exec() 方法中的 read() 方法。看,创建的临时文件填满后,我就要使用 exec() 方法了。在这种情况下,我使用的是 read() 方法。而现在我在想read()方法是否淹没了RAM内存?
  • 如果您不想逐行阅读,您可以一直阅读(SomeFixedAmount),直到您阅读了整个文件,但如果您需要阅读,您应该再次逐行阅读?跨度>
猜你喜欢
  • 2023-01-31
  • 1970-01-01
  • 2013-05-03
  • 2011-06-30
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多