【问题标题】:For Loop, os.listdir() not working correctly对于循环,os.listdir() 无法正常工作
【发布时间】:2009-12-13 04:26:29
【问题描述】:

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

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'

这真的会帮助我的朋友,所以我很有动力去做(而且非常[阅读:非常]编程新手)

感谢您提供的任何帮助

【问题讨论】:

  • 对不起,我想我不是很清楚。正在查看的目录 yearList 的内容中包含目录 2005、2006、2007、2008、2009 和 2010

标签: python directory


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    执行 chdir 后,当前目录将更改为子目录,因此您以后不能仅使用其名称移动到另一个子目录(第一个子目录的同级)。使用绝对路径将解决您的问题。

    试试

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

    在移动到同级之前返回父目录 os.chdir("..") 也可以。

    附带说明,最好使用os.path.join(driveLetter, clientName, year, "Folder One") 而不是driveLetter + clientName + '\\' + year + '\Folder One'。它也会使您的代码在其他操作系统上工作。我认为更具可读性。

    【讨论】:

    • 非常感谢您的提示。如果我有足够的权力这样做,我会投票
    【解决方案3】:

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

    os.chdir('..')
    

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

    另外,在这一行:

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

    你不应该在'\Folder One' 中转义\ 吗?

    【讨论】:

    • 感谢您的帮助,为大家 +1 :)
    【解决方案4】:

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

    How do I write a decorator that restores the cwd?

    【讨论】:

    • 非常感谢。看起来我有一些研究要做,所以我可以理解:)
    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2014-12-02
    • 2013-08-09
    • 2013-10-30
    • 2013-10-19
    相关资源
    最近更新 更多