[英]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.