Python 将列表元素传递给for循环

Python 将列表元素传递给for循环,python,Python,我试图将元素从列表传递到for循环,当然我得到了os.chdir()函数的经典错误“参数1必须是字符串而不是列表” 这是我的一段代码,任何关于如何绕过上述错误并将列表中的元素传递给脚本的其余部分的建议都将不胜感激 path= ['C:\\DataDownload\Administrative', 'C:\\DataDownload\Cadastral', 'C:\\DataDownload\Development'] for x in path[:]: os.chdir(path)

我试图将元素从列表传递到for循环,当然我得到了os.chdir()函数的经典错误“参数1必须是字符串而不是列表”

这是我的一段代码,任何关于如何绕过上述错误并将列表中的元素传递给脚本的其余部分的建议都将不胜感激

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)
您想要的是
os.chdir(x)
而不是
os.chdir(path)


path
是包含所有路径的列表(因此可能应命名为
path
),因此不能将其用作
chdir

的参数。首先,如果要以这种方式硬编码Windows路径,请将反斜杠加倍(否则,当路径中有一个
\t
时,会弹出意外行为)

无需复制列表(使用
path[:]
):
路径中的x也可以

无需显式调用
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))

查看可能会有帮助。

您可能还希望阅读与您的问题完全无关的循环,如果您使用一系列扩展名:
extensions=['.DXF'、'.dbf'、'.kmz'、…、'.xml']
。然后您可以执行类似于
的操作(map(lambda ext:basename.endswith(ext))的操作,扩展名)):os.remove(file)
,或仅
用于扩展名中的ext:if basename.endswith(ext):os.remove(file);break
谢谢Michael-我已将您的想法合并为“用于扩展名中的ext”进入我的代码-效率更高-对我来说是一个很好的学习!!@Michael:
endswith
支持元组作为输入,因此您的示例可以简化:
如果basename.endswith(exts):os.remove(fname)
,因为
exts
是一个扩展元组。@SilentGhost噢,handy.Thank交替使用原始字符串:
r'C:\DataDownload\Administrative'