for循环,os.listdir()不正常

1 投票
4 回答
3177 浏览
提问于 2025-04-15 16:58

我正在为我的一个朋友写一个脚本,用来创建新的文件夹结构。因为有大约一千个客户,所以用脚本来做会省很多时间。我几乎把所有的功能都搞定了,唯一没有搞定的就是这一部分。

yearList = os.listdir(driveLetter + clientName)
for year in yearList:
    os.chdir(year)
    os.mkdir('Folder One')
    os.mkdir('Folder Two')
    os.mkdir('Folder Three')

在这个部分下面,是用来创建子文件夹的,像这样:

# Create folders under 'Folder One'
    os.chdir(driveLetter + clientName + '\\' + year + '\Folder One')
    os.mkdir('Sub Folder One')
    os.mkdir('Sub Folder Two')

2005是年列表中的第一个元素。这个部分在处理2005的时候运行得很好,但我遇到了这个错误:

WindowsError: [Error 2] The system cannot find the file specified: '2006'

这对我的朋友真的很有帮助,所以我很想把它做好(而且我对编程还很新手)

谢谢任何能提供的帮助

4 个回答

0

当你使用chdir命令后,当前目录会切换到你指定的子目录,这样你就不能仅仅通过子目录的名字去访问另一个同级的子目录了。要解决这个问题,可以使用绝对路径。

试试这个:

os.chdir(os.path.join(driveLetter, clientName, year))

在切换到同级目录之前,先使用os.chdir("..")返回到上级目录也是可以的。

另外,建议使用os.path.join(driveLetter, clientName, year, "Folder One"),而不是driveLetter + clientName + '\\' + year + '\Folder One'。这样做可以让你的代码在其他操作系统上也能正常运行,而且我觉得这样写也更容易读懂。

0

在那个问题中,有一个上下文管理器可以用来暂时保存当前工作目录(cwd)。

我该如何写一个装饰器来恢复当前工作目录?

1

在这个 for year in yearList 的循环中,你进入了每年的子目录,但可能之后再也没有离开过。所以在第一次循环时,你进入了“2005”的子目录,而在第二次循环时,你仍然停留在这个子目录里。这样就会出现错误,因为在当前的“2005”目录下找不到“2006”这个目录。

你可以通过在循环结束时再离开这个子目录来解决这个问题:

for year in yearList:
    os.chdir(year)
    ...
    os.chdir('..')

撰写回答