簡體   English   中英

如何使用 os.walk() 遍歷根目錄中的子目錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM