使用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
相关产品推荐
相关产品推荐

