我有以下代码:
directory = r'D:\images'
for file in os.listdir(directory):
print(os.path.abspath(file))
我想要下一个输出:
等
但我得到了不同的结果:
其中D:\code是我当前的工作目录,结果与
os.path.normpath(os.path.join(os.getcwd(), file))
因此,问题是:当我必须使用os.path.abspath时,它的用途是什么?
os.path.normpath(os.path.join(directory, file))
来获得我的文件的真实绝对路径?如果可能的话,展示真实的用例。
发布于 2014-07-12 04:12:53
问题出在你对os.listdir()
的理解上,而不是os.path.abspath()
。os.listdir()
返回目录中每个文件的名称。这将为您提供:
img1.jpg
img2.jpg
...
当您将这些路径传递给os.path.abspath()
时,它们被视为相对路径。这意味着它相对于执行代码的目录。这就是为什么你会得到"D:\code\img1.jpg“。
相反,您要做的是将文件名与您列出的目录路径连接起来。
os.path.abspath(os.path.join(directory, file))
发布于 2014-07-12 04:12:02
listdir
生成目录中的文件名,而不引用目录本身的名称。在没有任何其他信息的情况下,abspath
只能从它所知道的唯一目录形成绝对路径:当前工作目录。您始终可以在循环之前更改工作目录:
os.chdir(directory)
for f in os.listdir('.'):
print(os.path.abspath(f))
发布于 2014-07-12 04:59:04
Python的原生os.listdir
和os.path
函数相当低级。遍历一个目录(或一系列降级目录)需要您的程序手动组装文件路径。可以方便地定义一个实用函数来生成您只需要一次的路径,这样路径汇编逻辑就不必在每次目录迭代中重复。例如:
import os
def better_listdir(dirpath):
"""
Generator yielding (filename, filepath) tuples for every
file in the given directory path.
"""
# First clean up dirpath to absolutize relative paths and
# symbolic path names (e.g. `.`, `..`, and `~`)
dirpath = os.path.abspath(os.path.expanduser(dirpath))
# List out (filename, filepath) tuples
for filename in os.listdir(dirpath):
yield (filename, os.path.join(dirpath, filename))
if __name__ == '__main__':
for fname, fpath in better_listdir('~'):
print fname, '->', fpath
或者,可以使用“更高级别”的路径模块,例如py.path、path.py和pathlib (现在是Python3.4版及更高版本的标准部分,但在2.7版本中可用)。这些为您的项目添加了依赖关系,但增加了文件、文件名和文件路径处理的许多方面。
https://stackoverflow.com/questions/24705679
复制相似问题