对python os.path.abspath的误解
我有以下代码:对python os.path.abspath的误解,python,path,os.path,Python,Path,Os.path,我有以下代码: directory = r'D:\images' for file in os.listdir(directory): print(os.path.abspath(file)) 我想要下一个输出: D:\images\img1.jpg D:\images\img2.jpg等 但我得到了不同的结果: D:\code\img1.jpg D:\code\img2.jpg 其中D:\code是我当前的工作目录,此结果与 os.path.normpath(os.path.
directory = r'D:\images'
for file in os.listdir(directory):
print(os.path.abspath(file))
我想要下一个输出:
- D:\images\img1.jpg
- D:\images\img2.jpg等
- D:\code\img1.jpg
- D:\code\img2.jpg
os.path.normpath(os.path.join(os.getcwd(), file))
所以,问题是:当我必须使用时,os.path.abspath的用途是什么
os.path.normpath(os.path.join(directory, file))
获取我的文件的真实绝对路径?如果可能,显示真实的用例。
listdir
在目录中生成文件名,而不引用目录本身的名称。在没有任何其他信息的情况下,abspath
只能从它可以知道的唯一目录(当前工作目录)形成一个绝对路径。在循环之前,始终可以更改工作目录:
os.chdir(directory)
for f in os.listdir('.'):
print(os.path.abspath(f))
问题在于您对
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))
Python的本机
os.listdir
和os.path
函数是非常低级的。迭代一个目录(或一系列降序目录)需要程序手动组装文件路径。可以方便地定义一个实用函数,该函数只生成一次所需的路径,这样就不必在每次目录迭代中重复路径组装逻辑。例如:
导入操作系统
def better_listdir(目录路径):
"""
生成器为每个
指定目录路径中的文件。
"""
#首先清理dirpath以绝对化相对路径和
#符号路径名(例如,`、`..`、和`~`)
dirpath=os.path.abspath(os.path.expanduser(dirpath))
#列出(文件名、文件路径)元组
对于os.listdir(dirpath)中的文件名:
yield(文件名,os.path.join(dirpath,文件名))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
对于fname,在better_listdir(“~”)中的fpath:
打印fname“->”,fpath
或者,也可以使用“更高级别”的路径模块,例如,和(现在是Python的标准部分,适用于3.4版和更高版本,但适用于2.7版)。这些会为项目添加依赖项,但会提升文件、文件名和文件路径处理的许多方面