You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用with语句调用NamedTemporaryFile遇AttributeError: __enter__的解决及路径问题

嘿,我来帮你搞定这个问题!先说说为啥会报错,再给你正确的写法,最后解答你关于路径可用性的疑问。

为啥会出AttributeError: __enter__?

你写的with NamedTemporaryFile(suffix='.shp').name as tmp_shp这里有个关键问题:NamedTemporaryFile().name返回的是个字符串路径,而with语句需要的是一个实现了__enter__和__exit__方法的上下文管理器对象。字符串根本没有这些方法,所以Python就抛出了这个错误。

正确使用with调用命名临时文件的姿势

你需要直接把NamedTemporaryFile的实例传给with,而不是它的name属性。另外,因为你要把DataFrame导出到这个文件,还有个必加的参数:delete=False——默认情况下,临时文件在关闭时会自动被删除,如果你想正常导出并使用这个文件,必须显式关掉自动删除的行为。

给你写个能跑的示例:

from tempfile import NamedTemporaryFile
# 假设你用的是geopandas的GeoDataFrame,根据你的实际库调整
import geopandas as gpd

# 先模拟你的DataFrame
df = gpd.GeoDataFrame(...)

with NamedTemporaryFile(suffix='.shp', delete=False) as tmp_file:
    # 从临时文件对象里拿到路径
    tmp_shp = tmp_file.name
    # 把DataFrame导出到这个临时文件
    df.to_file(tmp_shp)

tmp_shp在with外部能用吗?

这得看你有没有加delete=False:

  • 加了delete=False:with块结束后,临时文件不会被自动删除,tmp_shp对应的路径完全有效,你可以在外部继续读取、操作这个文件。不过用完之后记得手动删掉它,不然会留下垃圾文件:
    import os
    os.unlink(tmp_shp)
    
  • 没加(默认delete=True):with块一结束,临时文件就被自动删掉了,这时候tmp_shp虽然还是那个字符串,但对应的文件已经不存在了,再用这个路径会直接报错“文件找不到”。

内容的提问来源于stack exchange,提问作者user308827

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:54