2016-01-11 13 views
1

當我第一次將它編碼爲單個函數時,它工作正常。但是當我檢查目錄中的文件時,我想要做更多的事情,所以我將代碼分成了兩個函數:一個檢查以* .rar擴展名結尾的目錄上的文件,如果它找到匹配的文件,它解壓到一個目錄。將'文件'變量傳遞給函數時的TypeError

import shutil, os, patoolib, fnmatch, glob 


def unrar(): 

     patoolib.extract_archive(file, outdir="/root/tree/def") 



def chktree(): 

     for file in glob.glob('/root/tree/down/*'): 
       if fnmatch.fnmatch(file, '*.rar'): 
         unrar() 

chktree() 

if後執行unrar()從功能chktree():不起作用。我想知道我在做什麼錯了,這是輸出:

Traceback (most recent call last): 
    File "autotube.py", line 16, in <module> 
    chktree() 
    File "autotube.py", line 14, in chktree 
    unrar() 
    File "autotube.py", line 6, in unrar 
    patoolib.extract_archive(file, outdir="/root/tree/def") 
    File "/usr/local/lib/python2.7/dist-packages/patoolib/__init__.py", line 676, in extract_archive 
    util.check_existing_filename(archive) 
    File "/usr/local/lib/python2.7/dist-packages/patoolib/util.py", line 389, in check_existing_filename 
    if not os.path.exists(filename): 
    File "/usr/lib/python2.7/genericpath.py", line 26, in exists 
    os.stat(path) 
TypeError: coercing to Unicode: need string or buffer, type found 
+0

是否有任何理由,你不只是'glob.glob('/ root/tree/down/*。rar')'? – mgilson

+0

不要將'file'設置爲變量名,它在Python中的built_in名稱 – Arman

+0

[是否使用內置函數名稱作爲屬性或方法標識符是不好的做法?](http://stackoverflow.com/questions/9109333/is-it-it-bad-practice-to-use-a-built-in-function-name-as-an-a-attribute-or-method-ide) –

回答

3

在Python 2,還有一個內置的file,這是你在你的unrar函數調用extract_archive用。您沒有使用chktree的循環變量,因爲它只能在chktree之間生效。你可以寫這樣的:

def unrar(f): 
    patoolib.extract_archive(f, outdir="/root/tree/def") 

def chktree():  
    for f in glob.glob('/root/tree/down/*'): 
     if fnmatch.fnmatch(f, '*.rar'): 
      unrar(f) 

我用f作爲名稱的文件,以防止屏蔽內置。

+0

好的,這工作。我使用built-in,因爲我在做這件事時正在諮詢python文檔,他們使用built-in作爲示例。謝謝。 – xavier

+0

@ xavier也許你閱讀Python3文檔? '文件'不是那裏的內建。 – timgeb

+0

我剛剛檢查過,那些是Python 2.7.11的文檔:https://docs.python.org/2/library/fnmatch.html – xavier

3

你需要明確傳遞變量file到您呼叫的功能。另外,file是Python中的一個特殊名稱,所以您應該使用不同的名稱,例如my_file或簡單地f

import shutil, os, patoolib, fnmatch, glob 

def unrar(my_file): 
     patoolib.extract_archive(my_file, outdir="/root/tree/def") 

def chktree(): 
     for f in glob.glob('/root/tree/down/*'): 
       if fnmatch.fnmatch(f, '*.rar'): 
         unrar(f) 
chktree() 

此外,作爲@mgilson指出,你所看到的實際錯誤的原因就是,Python認爲你指的是內置的名稱file因爲你沒有通過該遮蔽它的參數。如果你使用了不同的名字,你應該得到NameError

+1

我認爲這是可能的候選人 - 但是,對於OP的代碼,我不認爲會產生TypeError。如果是這種情況,他會得到一個'NameError',並且上面(在問題中)發佈的代碼是正確的(它可能不是)。 – mgilson

+0

另外,我可以推薦使用PEP-8名稱 - 例如'my_file'而不是'myFile' :-) – mgilson

+1

@mgilson,我認爲這是一個重用內置名稱和缺少參數的組合。 – merlin2011