1,问题来源
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
那么以下这段代码的输出结果会是如何?
import os
dpath = 'E:'
path = 'E:\\'
print(os.getcwd()) # 当前工作目录 E:\jupyter
print(dpath,os.listdir(dpath))
print(path,os.listdir(path))
对于 os.listdir(dpath) 与 os.listdir(path) 的结果,大家可能会觉得都是输出E盘下的所有文件或文件夹的名字,但是事实并非大家所想那样!!!
print(dpath,os.listdir(dpath)) # 输出 当前工作目录下的所有文件或文件夹的名字
print(path,os.listdir(path)) # 输出 E盘下的所有文件或文件夹的名字
是不是觉得有点意外,反正我是觉得很意外,可能我比较菜吧,应该有大神看出原因了!
2,原因所在
这里要说明下demo中的dpath ,path 和当期工作目录都在同个磁盘下,即都在E盘,,在网上搜了下,stackoverflow已经有人提出过这个问题了,
链接:https://stackoverflow.com/questions/7258993/pythons-os-listdir-behaviour-on-windows/7259040#7259040
出现这种情况的原因不在Python,这本质上是一个Windows问题。在Windows中C:和C;\(或者C:/)代表着不同的意思!
C: 表示C驱动器上的当前目录:
C:(和C:/) 表示C驱动器的根目录:
所以os.listdir(dpath) 输出的实际是E盘上当前目录(E:\jupyter)的所有文件或文件夹的名字。而os.listdir(path) 输出的实际是E盘根目录(E:\)下所有文件或文件夹的名字。
如果还不理解,可以在dos 中演示一波
当前目录 C:\Users\yang
cd c:切换后,仍然是在 C:\Users\yang 这个目录下
cd c:\ 切换后,目录就变成了C:\
注意:刚才有说明demo中的dpath ,path 和当期工作目录都在同个磁盘下,那如果和当前工作目录不同呢?结果如何?
import os
dpath = 'D:'
path = 'D:\\'
print(os.getcwd())
print(dpath,os.listdir(dpath))
print(path,os.listdir(path))
此时 os.listdir(dpath) 和 os.listdir(path)的输出结果一致,都是D盘根目录下所有文件或文件夹的名字。
这是情况就有点奇怪了,但是这本质上是一个Windows问题,并非Python的问题,具体为什么要这样呢?这可能要问问下比尔盖茨,
所以,在涉及文件操作的时候,最好还是使用绝对路径,这是最保险的。