簡體   English   中英

Python-Os.walk遍歷不同驅動器中的目錄列表

[英]Python - Os.walk loop through list of directories in different drives

我是一名Python初學者,正在尋找有關使用os.walk搜索目錄列表的幫助。

我的想法是從SQL數據庫中提取目錄列表,這些目錄可能具有不同的驅動器號甚至UNC路徑。 我需要做的是在這些目錄中搜索以找到特定名稱的文件並將其刪除。 由於文件可以在任何目錄中,因此需要全部搜索。 目錄列表是不確定的,因此我的想法是將它們存儲到列表中,並讓os.walk查看該列表中的所有目錄。

def get_location():
    c.execute('SELECT ADDRESS FROM DIRECTORY')
    data = c.fetchall()
    SQLlist = [row for row in data]
    return SQLlist


addresslist = get_location()


def FileDeleter():
    for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False) for path in (str(addresslist[0:]))):
        for file in files:
            if correctID in file:
                if file.endswith('.custextn'):
                    os.remove(os.path.join(root, file))

這是當前代碼的樣子,但是以前我嘗試過:

    for root, dirs, files in os.walk(addresslist[0:], topdown=False):

    for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False)):

似乎os.walk不接受列表(/元組)。 如果我設置addresslist [0]或addresslist [1]實際上可以工作,但是由於我不知道可能有多少個地址,不幸的是我不能僅將X地址存儲為單獨的變量並復制該函數。

運行代碼時出現的錯誤是:

“ TypeError:預期的str,字節或os.PathLike對象,而不是列表”

最后,我用硬編碼的地址列表進行了測試,目的是排除列表如何從數據庫中提取的問題,例如:

addresslist = ['C:\\Subfolder1\\Subfolder2', 'D:\\Subfolder1\\Subfolder2']

並且,由於解包錯誤:

x,y = ['C:\\Subfolder1\\Subfolder2', 'D:\\Subfolder1\\Subfolder2']

謝謝

您的第一個for循環不會執行您想要的操作。 距離很近,但不完全是。

for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False) for path in (str(addresslist[0:])))

您的循環當前正在執行的操作是將addresslist轉換為字符串。 然后,您實際上是遍歷放置在path變量中的字符串中的每個字符。 然后,您嘗試鏈接一系列os.walk生成器。 但是os.walk需要一條路徑。 您也不會在代碼的其他任何地方使用該path變量。

應該是:

for path in addresslist:
   # it looks like you are worried that not all paths will be strings
   # if that's really a concern, then leave this next line.
   # Otherwise, I think it is safe to delete it
   path = str(path) 
   for root, dirs, files in os.walk(path, topdown=False):

這將從addresslist獲取每個元素(這是您要搜索的路徑),並對其進行os.walk 我認為您根本不需要在這里使用chain

如果要使用chain (不必要),則可以遵循此SO帖子提供的概述: os。一次遍歷多個目錄

for root, dirs, files in chain.from_iterable(os.walk(str(path)) for path in addresslist):

您應該做的另一件事是讓addresslist成為傳遞給函數的參數。

def FileDeleter(addresslist):
   # your function code here
# then you need to actually call the function
addresses = get_locations()
FileDeleter(addresses)

隨着代碼變得更加復雜,依賴全局變量會給您帶來很多麻煩。

我現在已經開始工作了,想確認一下我做了什么。

有兩個問題。 我需要@ TheF1rstPancake和@Michael Butscher建議的附加for循環。

第二個問題是從數據庫中提取目錄列表。

def get_location():
    c.execute('SELECT ADDRESS FROM DIRECTORY')
    data = c.fetchall()
    SQLlist = [row for row in data]
    return SQLlist

我在使用上面的方法,但是發現當您打印(數據)時,您得到了一個元組元組或元組列表,但這些元組無法循環通過以供os.walk使用。 結果看起來像

[('C:\\Subfolder1\\Subfolder2',), ('D:\\Subfolder1\\Subfolder2',)]

我使用的解決方案如下

def get_location():
    c.execute('SELECT ADDRESS FROM DIRECTORY')
    data = c.fetchall()
    SQLlist = []
    for row in range(len(data)):
        SQLlist.append(data[row][0])
    return SQLlist

現在,這給了我列表:

['C:\\Subfolder1\\Subfolder2', 'D:\\Subfolder1\\Subfolder2']

通過附加的for循環運行此列表時,os.walk現在可以正確搜索所有目錄。

感謝大家的幫助,非常感謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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