如何使用NamedTemporaryFile(什么时候关闭?)

2024-03-21

我正在尝试编写一系列写入临时文件的函数,然后对写入的文件进行处理。我试图了解该文件是如何处理的。

我想做的摘要是:

def create_function(inputs):
    # create temp file, write some contents

def function1(file):
    # do some stuff with temp file

def function2(file):
    # do some other stuff with temp file

这样我就可以做类似的事情:

my_file = create_function(my_inputs)
function1(my_file)
function2(my_file)

这就是我实际所做的:

def db_cds_to_fna(collection, open_file):
    """
    This pulls data from a mongoDB and writes it to a temporary file - just writing an arbitrary string doesn't alter my question (I'm pretty sure)
    """
    for record in db[collection].find({"type": "CDS"}):
        open_file.write(">{}|{}|{}\n{}\n".format(
            collection,
            record["_id"],
            record["annotation"],
            record["dna_seq"]
            )
        )

    return open_file.name

def check_file(open_file):
    lines = 0
    for line in open_file:
        if lines < 5:
            print line
            lines += 1
        else:
            break

使用此代码,如果我运行以下命令:

from tempfile import NamedTemporaryFile
tmp_file = NamedTemporaryFile()
tmp_fna =  db_cds_to_fna('test_collection', tmp_file)

check_file(tmp_file)

该代码运行,但实际上不打印任何内容。但该文件显然在那里并已写入,因为如果我运行print Popen(['head', tmp_fna], stdout=PIPE)[0],我得到了预期的文件开头。或者,如果我改变check_file()接受tmp_file.name and do with open(tmp_file.name, 'r')...在函数内部,它起作用了。

所以问题 1 是 - 为什么我可以写信给tmp_file,但是如果不重新打开它就无法从不同的函数中读取它?

现在,我真正想做的是tmp_file = NamedTemporaryFile()在 - 的里面db_cds_to_fna()函数,但是当我尝试这个并运行时:

tmp_fna =  db_cds_to_fna('test_collection')
check_file(tmp_file)

我收到一个错误No such file or folder

所以问题 2 是:有没有办法保留临时文件以供另一个函数使用?我知道如何将文件写入指定路径然后删除它,但我怀疑有一种内置方法可以做到这一点,我想学习。


您正在写入文件,但随后尝试从写入的末尾读取它。添加一个seek https://docs.python.org/2/library/stdtypes.html#file.seek在开始阅读之前,请返回到文件的开头:

def check_file(open_file):
    lines = 0
    open_file.seek(0)
    for line in open_file:
        if lines < 5:
            print line
            lines += 1
        else:
            break

对于你的第二个问题,请注意NamedTemporaryFile作品就像TemporaryFile https://docs.python.org/2/library/tempfile.html#tempfile.TemporaryFile在那里面:

一旦关闭就会被销毁(包括隐式的 当对象被垃圾回收时关闭)。

如果您在函数中打开文件然后返回,则该文件将超出范围并将被关闭并进行垃圾收集。您需要保持对文件对象的引用处于活动状态,以防止其被收集。您可以通过从函数返回文件对象(并确保将其分配给某个对象)来完成此操作。这是一个简单的例子:

def mycreate():
    return NamedTemporaryFile()
def mywrite(f, i):
    f.write(i)
def myread(f):
    f.seek(0)
    return f.read()

f = mycreate()        # 'f' is now a reference to the file created in the function, 
                      # which will keep it from being garbage collected
mywrite(f, b'Hi')
myread(f)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用NamedTemporaryFile(什么时候关闭?) 的相关文章

随机推荐

  • 在两个单独的脚本之间共享变量[重复]

    这个问题在这里已经有答案了 我正在尝试在两个单独的选项卡中运行的两个不同的 Tampermonkey 脚本之间共享变量 我尝试在一个脚本中使用 GM setValue 然后在另一个脚本中使用 GM getValue 检索它 但没有成功 所以
  • XML:跨越其他元素的里程碑或元素

    我正在与OSIS http bibletechnologies net 开放圣经信息标准 用于描述圣经和相关文本的 XML 模式 当我第一次查看 XML 示例时 我注意到一些以前在 XML 中从未见过的奇怪之处 主要是关闭的标签 然后是逻辑
  • ANDROID_HOME 和 ANDROID_SDK_ROOT 环境变量均未导出 - Windows 10

    我是一个初学者 正在学习appium工具 尝试启动 appium 会话并收到错误 An unknown server side error occurred while processing the command Original err
  • 如何使用 mysqli 插入 MySQL

    我刚刚学习数据库 我希望能够存储用户输入 关于如何使用 PHP 获取表单数据并将其保存到数据库的基本示例是什么 还确保表单安全SQL攻击 http en wikipedia org wiki SQL injection File 示例 ht
  • Scala脚本等待mongo完成任务

    我正在编写一个简单的基于 scala 的脚本 该脚本应该将一些数据插入 Mongo 集合中 问题是 该脚本在 mongo 完成其任务之前退出 考虑以下脚本 处理该问题的惯用 最佳方法是什么 usr bin env scalas scalaV
  • 如何检查可以找到多少列字符[重复]

    这个问题在这里已经有答案了 我有一个包含 4 列的数据集 其中包含名称 其中名称的数量和名称的顺序在列之间有所不同 某些列还可以包含相同的名称两次或更多次 看起来如下 df lt data frame x1 c Ben Alex Tim L
  • SQL Server 将字符串长度减少到 8000 个字符

    我正在尝试将数据插入列数据类型为的表中NTEXT 理想情况下 它应该存储超过 8000 个字符 但在我的情况下 它会将其减少到 8000 个字符 我正在程序中运行时进行插入查询 以下是该过程正在进行的示例查询 INSERT INTO TMP
  • Eclipse 中的 CPLEX 库路径错误

    我正在使用 eclipse 进行 java 编码 我完成了代码 它在 CPLEX 库 12 6 上运行良好 我在属性 gt 库 gt 添加外部 jar gt cplex jar 中添加了库 我想更改CPLEX 12 7的库 所以我删除了以前
  • POI条形图生成一系列有问题

    我使用 JDK8 和 POI 4 1 0 使用它们的示例herea link http svn apache org repos asf poi trunk src examples src org apache poi xwpf user
  • c 中 tan(90) 的值?

    它给出的值是 557135813 94455 每次值都会保持不变吗 为什么它不显示无穷大 include
  • DISTINCT() 和 ORDERBY 问题

    我正在学习 LINQ to SQL 一切都很顺利 直到发生了一些奇怪的事情 我试着举个例子distinct 因此 使用 Northwind 数据库 我编写了以下查询 var query from o in db Orders orderby
  • 带有徽标的 A 框链接

    我想使用徽标从场景内部链接到外部 URL 常规网站 而不是 VR 这就是我所拥有的
  • 使用新安装的模块而无需重新启动交互式会话

    在长时间的交互会话 使用 ipython 中 我有时需要使用尚未安装的模块 安装新模块后 该模块可以在新的交互式会话中导入 但不能在安装之前运行的会话中导入 由于我正在使用内存中的所有变量 我不想重新启动会话 我怎样才能获得这样一个先前运行
  • 你能推荐一些Python HTTP客户端库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想使用Python从一些网站捕获信息 我希望HTTP客户端满足这个条件 支持HTTPS 不会使用太多
  • 通过自动布局在 UIScrollView 中使用顶部布局指南

    I want to use the Top Layout Guide in the UIScrollView through Auto Layout Without the UIScrollView Auto Layout works we
  • 是否可以在没有 sqlite 函数的情况下将 SQLite 数据库与 PHP 一起使用?

    我的 PHP 安装没有 SQLite Functionality 作为基本安装 因此没有 sqlite 函数可用 是否有一个 PHP 库 PHP 代码 可以访问 SQLite 数据库 而无需在 PHP 中安装任何插件 我无法更改服务器配置
  • 如何计算 (a*b)%c 形式的模数?

    如何计算 a b c 形式的模数 我想计算两个 int 数字相乘的模数 它们几乎处于溢出阶段 这里 c 也是 int a b c a c b c c
  • 是否对使用“OR”的 SQL SERVER 表达式的所有部分进行求值?

    Given WHERE Id Is NULL OR Id Table Id 如果 Id 为 null 表达式的计算结果为 true 第二部分 Id Table Id 是否仍然被考虑 或者 如果第一部分是 c 中的情况 则表达式计算结果为 t
  • 你能在 shell 脚本中生成一个进程吗?

    我试图让我的 bin sh shell 脚本启动另一个应用程序而不暂停执行 也就是说 我正在寻找一种在后台启动它并让我的 shell 脚本继续执行的方法 我希望它能像这样工作 start daemon start success launc
  • 如何使用NamedTemporaryFile(什么时候关闭?)

    我正在尝试编写一系列写入临时文件的函数 然后对写入的文件进行处理 我试图了解该文件是如何处理的 我想做的摘要是 def create function inputs create temp file write some contents