在Python中从打开的文件获取路径

164
如果我有一个已打开的文件,是否有一个os调用可以获取完整路径作为字符串?
f = open('/Users/Desktop/febROSTER2012.xls')

我如何从f中获取"/Users/Desktop/febROSTER2012.xls"


我认为这个答案更好:os.path.realpath(f.name)。来源:https://dev59.com/JGkw5IYBdhLWcg3w8fFJ#38867035 - Charlie Parker
4个回答

193

这里的关键是打开文件后代表它的 f 对象的 name 属性。你可以像这样获取它:

>>> f = open('/Users/Desktop/febROSTER2012.xls')
>>> f.name
'/Users/Desktop/febROSTER2012.xls'

这有帮助吗?


7
使用 tempfile.TemporaryFile(mode='w', prefix='xxx', suffix='.txt') 创建的文件无法正常工作!请检查代码。 - Victor
22
@Victor:请阅读tempfile模块的文档,特别是tempfile.NamedTemporaryFile。该文档位于您提到的tempfile.TemporaryFile文档的下方,这是用于临时文件的具体情况,在文档中可以看到已经存在解决方案。tempfile.TemporaryFile不适用于需要读取名称的情况。 - Tadeck
16
使用 open('foo.txt', 'w') 创建一个文件,然后执行 f.name,它只会输出 foo.txt。 - searchengine27
1
请注意,如果您使用相对路径,例如 f = open('some/relative/path'),然后更改工作目录,例如 os.chdir('somewhere/esle'),那么 f.name 将不会相应地更新,并且在当前工作目录中将没有意义。 - user986730
1
请注意,在重命名文件时,f.name并不会更改,而文件处理程序仍将指向现在位于不同名称下的文件。严格地说,f.name不一定返回当前文件名。(至少在我的GNU/Linux发行版中是这样的)。 - Bastian
显示剩余4条评论

154

我遇到了完全相同的问题。如果你使用的是相对路径,os.path.dirname(path) 只会返回相对路径。os.path.realpath 可以解决这个问题:

>>> import os
>>> f = open('file.txt')
>>> os.path.realpath(f.name)

28
这实际上是真正的答案。 - BlueTrin
5
只有在相对文件路径仍然是正确的文件路径时,该方法才有效。如果我从目录“/Documents/”指定文件名为“text.txt”,然后切换到“/”目录,则“os.path.realpath”将返回“/text.txt”,而不是“/Documents/text.txt”。 - K. Nielson
1
我注意到 realpath 存在一个问题。它不会更正文件 alpha 字符的大小写,而是保留 open 语句中使用的大小写。我本来希望它能返回文件在文件系统上实际存在的名称。(当然,这是在 Windows 上) - RufusVS
请注意,当重命名文件时,f.name 不会更改,而文件处理程序仍将指向现在位于不同名称下的文件。 (至少在我的 GNU / Linux 发行版中是这种情况)。因此,严格来说,f.name 不一定返回当前文件名。 - Bastian
另一个问题是 name 可能是类似于 <stdin> 的东西。 - Timmmm

17

如果你只想获取目录名而不需要文件名,那么可以使用Python的os模块以以下常规方式完成。

>>> import os
>>> f = open('/Users/Desktop/febROSTER2012.xls')
>>> os.path.dirname(f.name)
>>> '/Users/Desktop/'

通过这种方式,您可以获取目录结构。


如果您使用f = open('febROSTER2012.xls'),则会返回一个空字符串。如何获取完整路径? - NZD

8
你也可以像这样获得它。
filepath = os.path.abspath(f.name)

4
这将把它附加到当前工作目录,而不是其实际所在的目录。 - Bachsau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接