Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对python os.path.abspath的误解_Python_Path_Os.path - Fatal编程技术网

对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
其中D:\code是我当前的工作目录,此结果与

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版)。这些会为项目添加依赖项,但会提升文件、文件名和文件路径处理的许多方面