[英]How to loop over sub-directories within a root directory using os.walk()?
我有一個名為“2013”的根目錄,其中包含一些子目錄,如下所示:
2013/:
1/:
ANAR/
2/:
ANAR/
我打算做的是通過最里面的子目錄(即ANAR)使用os.walk()到go,如果它不存在,則在其中創建一個類似的文件夾。 這是我的代碼:
for root, dirs, files in os.walk ('./2013/'):
for f in dirs:
if not f.isdigit():
path = os.path.join (root, f)
fullpath = f'{path}{os.path.sep}{f}'
if not os.path.isdir (fullpath):
os.mkdir (fullpath)
但我遇到以下錯誤(在./2013/2/ANAR/ 內創建一堆 ANAR 目錄):
OSError:[Errno 36] 文件名太長:'./2013/2/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/阿納/阿納/...
關於原因的任何想法?
os.walk
不是你需要的。 您有一個固定的啟動設置,並且您要創建的所有目錄都在同一級別,因此使用這樣的遞歸方法比所需的復雜得多......特別是因為您真的不應該修改子目錄結構而迭代它。
你可以用os.listdir
做到這一點:
import os
root = '2013'
for entry in os.listdir(root):
path = os.path.join(root, entry)
if os.path.isdir(path):
os.mkdir(os.path.join(path, 'ANAR', 'ANAR'))
但是您在評論中提到編號文件夾是幾個月。 你會一直擁有全部十二個嗎? 如果是這樣,您甚至不需要遍歷目錄。
import os
for month in range(1, 13):
os.mkdir(os.path.join('2013', str(month), 'ANAR', 'ANAR'))
不過,無論哪種情況,我都建議使用pathlib
而不是os
,因為它可以使您的代碼更加清晰。 特別是,它為您的操作系統處理正確的路徑分隔符,您可以只使用正斜杠。
from pathlib import Path
for month in range(1, 13):
Path(f'2013/{month}/ANAR/ANAR').mkdir()
或者,如果您的月份列表不完整並且想要遍歷文件夾:
from pathlib import Path
for entry in Path('2013').iterdir():
if entry.is_dir():
(entry / 'ANAR/ANAR').mkdir()
(注意/
運算符可以將字符串(或其他 Path 對象)連接到現有的 Pat 對象上。)
最后,如果其中一些ANAR
子文件夾已經存在,它們都會引發錯誤。 如果可能有一些可能已經存在(也許您啟動了腳本但不得不中止它?),使用Path.mkdir(exist_ok=True)
將忽略此類錯誤並繼續創建任何尚不存在的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.