对于Loop,os.listdir()无法正常工作

时间:2009-12-13 04:26:30

标签: python directory

我正在创建一个脚本来为我的朋友创建新的文件夹层次结构。大约有一千个客户端,因此脚本可以节省大量时间。我有一切几乎都在工作,我没有的部分就是这个。

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是yearList列表中的第一个元素。这在2005年运行良好,但我收到此错误:

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

这对我的朋友来说真的很有帮助,所以我非常有动力去做这件事(而且很好[读:非常]新编程)

感谢您提供的任何帮助

4 个答案:

答案 0 :(得分:1)

for year in yearList循环中,您将更改为年份的子目录,但可能永远不会再次离开。因此,在第一次迭代中,您输入“2005”子目录,在第二次迭代中,您仍然在该子目录中。然后你得到的错误是没有“2006”目录(在当前的“2005”目录中)。

您可以通过在循环结束时再次保留子目录来解决此问题:

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

答案 1 :(得分: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'。它还可以使您的代码在其他操作系统上运行。我会争辩说有点可读性。

答案 2 :(得分:0)

我没有在Windows上测试过这个,但os.listdir(...)返回一个列表,其中包含给定目录中的每个项目的名称(在您的情况下,是文件夹)。请记住,这不是一个绝对路径,所以当你切换到子目录时,你不能只用os.chdir()来回复下一个项目。你需要上一个目录,如下所示:

os.chdir('..')

或使用不同的函数来跟踪绝对路径。

另外,在这一行:

os.chdir(driveLetter + clientName + '\\' + year + '\Folder One')

你不应该逃避\中的'\Folder One'吗?

答案 3 :(得分:0)

您可以使用上下文管理器将cwd临时存储在该问题中:

How do I write a decorator that restores the cwd?