2011-06-20 86 views
0

有人能告訴我下面的函數聲明是否將相對路徑傳遞給函數的正確方法?該調用僅使用一個變量。當我包含第二個變量(絕對路徑)時,我的函數不起作用。在函數中傳遞相對路徑

def extract(tar_url, extract_path='.'): 

呼叫不起作用:

extract(chosen, path) 

這工作,但不提取:

extract(chosen) 

全碼:

def do_fileExtract(self, line): 
    defaultFolder = "Extracted" 
    if not defaultFolder.endswith(':') and not os.path.exists('c:\\Extracted'): 
     os.mkdir('c:\\Extracted') 
     raw_input("PLACE .tgz FILES in c:\Extracted AT THIS TIME!!! PRESS ENTER WHEN FINISHED!") 
    else: 
     pass 

    def extract(tar_url, extract_path='.'): 
     print tar_url 
     tar = tarfile.open(tar_url, 'r') 
     for item in tar: 
      tar.extract(item, extract_path) 
      if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1: 
      extract(item.name, "./" + item.name[:item.name.rfind('/')]) 


    userpath = "Extracted" 
    directory = os.path.join("c:\\", userpath) 
    os.chdir(directory) 
    path=os.getcwd() #Set log path here 
    dirlist=os.listdir(path) 


    files = [fname for fname in os.listdir(path) 
        if fname.endswith(('.tgz','.tar'))] 

    for item in enumerate(files): 
     print "%d- %s" % item 

    try: 
     idx = int(raw_input("\nEnter the file's number:\n")) 
    except ValueError: 
     print "You fail at typing numbers." 

    try: 
     chosen = files[idx] 
    except IndexError: 
     print "Try a number in range next time." 


    newDir = raw_input('\nEnter a name to create a folder a the c: root directory:\n') 
    selectDir = os.path.join("c:\\", newDir) 
    path=os.path.abspath(selectDir) 

    if not newDir.endswith(':') and not os.path.exists(selectDir): 
     os.mkdir(selectDir) 


    try: 

     extract(chosen, path) 
     print 'Done' 
    except: 
     name = os.path.basename(sys.argv[0]) 
     print chosen 
+0

由於相關代碼從問題中缺失,我嘗試猜測:'extract()'是一個類的方法,並且您忘記了'self'參數。 –

+0

看起來很好。當你說它不起作用你是什麼意思?它是否打印錯誤? – Evgeny

+0

@Sven Marnach - 是強制性的嗎? @Evgeny - 它不會打印一個錯誤,就是我沒有向調用中添加第二個變量,提取,但是當我添加第二個變量(路徑)時,它只創建一個文件夾(不提取)。 – suffa

回答

1

它看起來像你在中錯過了轉義字符 我不認爲raw_input將提示字符串視爲原始字符串,只是用戶輸入。 但是這不應該影響你的程序的功能。

你在Unix或Windows?我的印象是,在Unix上,您使用/正斜槓而不是\\反斜槓作爲分隔符。

我測試了這個文件中的一些代碼: http://simkin.asu.edu/geowall/mars/merpano0.tar.gz

下面的代碼:

>>> from os import chdir 
>>> import tarfile 
>>> chdir(r'C:\Users\Acer\Downloads') 
>>> tar_url = 'merpano0.tar.gz' 
>>> print tar_url 
merpano0.tar.gz 
>>> tar = tarfile.open(tar_url, 'r') 
>>> extract_path = 'C:\\Users\\Acer\\Downloads\\test\\' 
>>> for item in tar: 
    tar.extract(item, extract_path) 
對我到底有沒有問題,乾淨執行

。在test目錄中,我用一些文件獲得了一個文件夾,與原始tar文件完全相同。你能解釋一下你在代碼中做了什麼不同的事情嗎?

+0

在Windows機器 – suffa

+0

@user:不知道這是如何正確的答案,但如果有什麼我很樂意幫助你爲自己弄明白。 –