亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

重命名文件夾和文件,而 os.walk() 更改目錄名稱后丟失了一些文件

重命名文件夾和文件,而 os.walk() 更改目錄名稱后丟失了一些文件

慕田峪7331174 2021-08-05 18:21:06
我有一個這樣的文件夾結構:Template  - Template1  - Template2TemplateTest  - TemplateTest1Config  - TemplateConfig我想將每個文件名和每個文件夾名的“模板”替換為“MyApp”。這是我的代碼:for root, dirs, files in os.walk(path):    for name in files:        if name.startswith("Template"):            replace = name.replace("Template",'MyApp')            os.rename(os.path.join(root,name),os.path.join(root,name.replace(old,new)))    for name in dirs:        if name.startswith("Template"):            replace = name.replace("Template",'MyApp')            os.rename(os.path.join(root,name),os.path.join(root,replace))奇怪的是,這只替換了文件夾名稱,而父文件夾名稱的文件名不需要更改。像這樣:MyApp  - Template1  - Template2MyAppTest  - TemplateTest1Config  - MyAppConfig但如果我執行此代碼兩次,那么它將替換文件。我想知道為什么以及如何更改代碼以替換我需要的所有內容?
查看完整描述

2 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

(請注意,調用簽名為os.walk:


os.walk = walk(top, topdown=True, onerror=None, followlinks=False)

所以你正在通過True, None, 和False.)


問題與os.walk遍歷目錄和文件的順序以及它進入哪些目錄和文件有關。


特別是,它首先讀取位于 的目錄path。這會產生以下結果:


['Template', 'TemplateTest', 'Config']

所有這些都是目錄,因此它下次將遍歷的子目錄列表是相同的,并且沒有文件。這在第一次迭代中作為三個值返回:


path

['Template', 'TemplateTest', 'Config']

[]

然后,您執行自己的代碼,在其中調用os.renameon Template,以便現在將其命名為MyApp,然后調用on ,以便現在TemplateTest將目錄命名為MyAppTest。


接下來,os.walk代碼嘗試讀取子目錄Template。這失敗了,所以什么也沒有發生(onerror是None)。


接下來,os.walk代碼嘗試讀取子目錄TemplateTest。這失敗了,所以什么也沒有發生。


最后,os.walk代碼嘗試讀取子目錄Config。這成功了,一切順利。


有兩種不同的解決方案:您可以設置topdown為False,或者您可以更新已命名的列表,dirs以便os.walk知道目錄的新名稱。(編輯:我不確定topdown=False會修復它;這需要測試。)


查看完整回答
反對 回復 2021-08-05
  • 2 回答
  • 0 關注
  • 324 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號