繁体   English   中英

在 Python 3.x 中,为什么 os.chdir() 在与 os.listdir() 和 os.scandir() 一起使用时表现不同? (Python 3.9.7)

[英]In Python 3.x, why does os.chdir() behave differently when used with os.listdir() and os.scandir() ? (Python 3.9.7)

当调用os.listdir()生成的项目与os.scandir()生成的项目时,我对os.chdir()的行为感到困惑。 我意识到os.scandir()创建DirEntry对象,而os.listdir()没有(可能只是返回字符串),但是如果这解释了我所看到的行为,我仍然不太明白为什么 这就是我的意思:

我有一个包含三个子目录的目录。 我想进入每个子目录,做一些事情,然后进入下一个并做同样的事情,等等。出于教学目的,我没有使用os.walk或其他任何复杂的东西。 这是显示(对我而言)令人困惑的结果的代码(请注意,这只是测试代码,所以我在这里做的是最简单的“事情”,即打印一些东西):

def listdir_test(path="D:/python-venvs/pyinst"):
    print("\n----- listdir() output ---------")
    for item in os.listdir(path):
        if os.path.isdir(item):
            print(item)
            os.chdir(item) # this happens only once, for the first directory found
            print(os.getcwd())


def scandir_test(path="D:/python-venvs/pyinst"):
    print("\n-------- scandir() output ------------")
    for item in os.scandir(path):
        if os.path.isdir(item):
            print(item)
            os.chdir(item) # this happens three times, for each of the directories found
            print(os.getcwd())


listdir_test()
scandir_test()

如您所见,这些函数是相同的,只是一个操作listdir()输出,另一个操作scandir()输出。 但是第一个函数只在一个os.chdir(item)操作后就放弃了,而不是对所有三个目录都这样做。 第二个函数的行为与我预期的一样,对三个目录中的每一个都重复os.chdir(item)操作。 下面是上面代码的输出:

----- listdir() output ---------
1.3.1.2-modules
D:\python-venvs\pyinst\1.3.1.2-modules

-------- scandir() output ------------
<DirEntry '1.3.1.2-modules'>
D:\python-venvs\pyinst\1.3.1.2-modules
<DirEntry 'packages'>
D:\python-venvs\pyinst\packages
<DirEntry 'pyinst-venv'>
D:\python-venvs\pyinst\pyinst-venv

我不明白为什么os.chdir(item)在我将它与os.listdir()输出一起使用时显然会导致for循环退出。 可能有一个很好的理由。 出于学习目的,我很想知道它是什么,以便更好地理解这些功能。 在此先感谢您的帮助!

当被视为路径(通过os.chdir类的os.chdir )时, DirEntry对象将转换为其path属性,而不仅仅是一个DirEntry名称。 相比之下, os.listdir返回裸名。

在您的os.listdir代码中,您传递的是裸名称,这些名称被视为相对于当前工作目录。 使用os.chdir更改当前工作目录os.chdir ,这些名称不再解析为您希望它们解析为的内容。

相反,您的os.scandir代码使用文件路径,并且由于原始scandir参数是绝对路径,因此您从scandir中获得的路径也是绝对路径。 绝对路径的解释不依赖于当前的工作目录,因此当您更改工作目录时,内容不会中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM