我已经(非常简单地)将一个Python脚本从Windows移植到Linux(主要是目录更改),我想为它添加一些新功能。 该脚本用于更新游戏服务器上的mod。所有mod都位于ShooterGame / Content / Mods /中。默认包含一些mod(TheCenter和11111111) - 每个其他mod与默认文件位于同一文件夹中,但名称由随机数组成。
我一直试图排除2个默认目录,然后构建ShooterGame / Content / Mods /文件夹的内容列表,但我没有这样做。 这是我尝试用来排除TheCenter文件夹的代码:
def build_list_of_mods(self):
"""
Build a list of all installed mods by grabbing all directory names from the mod folder
:return:
"""
exclude = ["TheCenter"]
if not os.path.isdir(os.path.join(self.working_dir, "ShooterGame/Content/Mods/")):
return
for curdir, dirs, files in os.walk(os.path.join(self.working_dir, "ShooterGame/Content/Mods/")):
for d in dirs:
dirs[:] = [d for d in dirs if d not in exclude]
self.installed_mods.append(d)
break
遗憾的是,它没有用。我错过了什么或者做错了吗?
答案 0 :(得分:0)
尝试将topdown=True
添加到os.walk()
函数中,如下所示:
for curdir, dirs, files in os.walk(os.path.join(self.working_dir, "ShooterGame/Content/Mods/"), topdown=True):
另外我无法尝试,但可能dirs[:]
应该在 for-loop 之外,正如文档所说:
当topdown为true时,调用者可以就地修改dirnames列表(例如,通过del或slice赋值),walk只会递归到名称保留在dirnames中的子目录中;
答案 1 :(得分:0)
我假设您希望self.installed_mods
包含dirs
的值而不包含exclude
的值。
您只需使用dirs.remove()
的值调用exclude
,然后将dirs
的内容附加到self.installed_mods
即可。
或者以较短的方式:self.installed_mods.extend([dir for dir in dirs if dir not in exclude])
。