【发布时间】: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