2010-07-12 112 views
2

我想从一个列表中的元素传递给一个for循环,当然我得到的经典错误“参数1必须是一个字符串不把” - 为os.chdir()功能。传递列表元素的for循环

这里是我的代码,有什么建议,我怎么能找到解决上述错误,仍然通过我的列表中的元素到脚本的其余部分,以便它遍历每个人将不胜感激!

path= ['C:\\DataDownload\Administrative', 'C:\\DataDownload\Cadastral', 'C:\\DataDownload\Development'] 
for x in path[:]: 
    os.chdir(path) 
    #Remove all previous files from the current folder 
    for file in os.listdir(path): 
    basename=os.path.basename(file) 
    if basename.endswith('.DXF'): 
     os.remove(file) 
    if basename.endswith('.dbf'): 
     os.remove(file) 
    if basename.endswith('.kmz'): 
     os.remove(file) 
    if basename.endswith('.prj'): 
     os.remove(file) 
    if basename.endswith('.sbn'): 
     os.remove(file) 
    if basename.endswith('.sbx'): 
     os.remove(file) 
    if basename.endswith('.shp'): 
     os.remove(file) 
    if basename.endswith('.shx'): 
     os.remove(file) 
    if basename.endswith('.zip'): 
     os.remove(file) 
    if basename.endswith('.xml'): 
     os.remove(file) 
+0

完全无关你的问题,它会使你的生活更容易,如果你使用的扩展数组:'一些推广= [“.DXF”,“.DBF”,“名为.kmz”,...,” .XML “]'。然后,你可以这样做'如果有的话(图(拉姆达分机:basename.endswith(EXT),扩展)):os.remove(文件)'或'只是在扩展分机:如果basename.endswith(EXT): os.remove(文件);打破' – 2010-07-12 17:47:03

+0

感谢迈克尔 - 我已经将你的想法“扩展扩展”纳入我的代码 - 更有效率 - 一个伟大的学习对我来说! – Jay 2010-07-12 18:13:48

+3

@迈克尔:'endswith'支持元组作为输入,因此你例如可以简化:'如果basename.endswith(EXTS):鉴于os.remove(FNAME)','exts'是扩展的一个元组。 – SilentGhost 2010-07-12 18:37:52

回答

6

想要os.chdir(x)而不是os.chdir(path)

path是包含所有路径(因此可能被命名为paths)的列表,因此您不能将其用作chdir的参数。

+0

谢谢 - 完美的作品!我会记住,从现在开始... – Jay 2010-07-12 17:44:10

+0

您可能也想在阅读了for循环http://docs.python.org/tutorial/controlflow.html#for-statements和http://www.faqs。 org/docs/diveintopython/fileinfo_for.html – Wilduck 2010-07-12 17:45:48

2

首先,反斜线如果你想硬编码的Windows路径这种方式(否则你就会有意外的行为弹出,一旦你有你的,例如路径\t)。

无需复制列表(使用path[:]):for x in path也可以。

无需显式地调用os.chdir ...

而且if子句是有点丑(且难于维护);这个例子可以这样简化:

directories = ['C:\\DataDownload\\Administrative', 
       'C:\\DataDownload\\Cadastral', 
       'C:\\DataDownload\\Development'] 

for directory in directories: 
    for filename in os.listdir(directory): 
    base_filename, extension = os.path.splitext(filename) 
    if extension in ['.DXF','.dbf','.kmz','.prj','.sbn','.sbx', 
         '.shp','.shx','.zip','.xml']: 
     os.remove(os.path.join(directory, filename)) 

查看os module documentation可能会有帮助。

+1

或者使用原始字符串:'r'C:\ DataDownload \ Administrative'' – 2010-07-12 18:46:17