2015-10-20 42 views
2

我最近開始使用導入來更好地組織python中的代碼。我在file1.py原始代碼中使用的行:python:文件路徑不再適用於imp

def foo(): 
    files = [f for f in os.listdir('.') if os.path.isfile(f)] 
    print files 
    #do stuff here.... 

哪個引用在同一文件夾中的代碼,示出print files正確的輸出作爲文件名的陣列中的所有文件。

不過,我最近改變了在目錄結構是這樣的:

./main.py 
./folder1/file1.py 
./folder1/data_file1.csv 
./folder1/data_file2.csv 
./folder1/...... 

而在main.py,我使用:現在

import imp 
file1 = imp.load_source('file1', "./folder1/file1.py") 
. 
. 
. 

file1.foo() 

files是一個空數組。發生了什麼?除了相對我已經嘗試了絕對的文件路徑。直接聲明一個數組data_file1.csv工程,但我無法得到任何其他工作與此導入。

這是怎麼回事?

+0

你收集'file1'和朋友到'files'? – Borealid

+0

其完全空?它甚至沒有'main.py'? –

+0

@abgordon,你是否正在'folder1'中查找文件? –

回答

1

當你做os.listdir('.'),你試圖列出'.'(這是當前目錄)的內容,但這不需要是腳本所在的目錄,它將是你所在的目錄在你運行腳本的時候(除非你在python腳本中使用os.chdir())。

您不應該依賴當前的工作目錄,而應該使用__file__來訪問當前腳本的路徑,然後您可以使用os.path.dirname()來獲取腳本所在的目錄。

然後,您可以使用os.path.join()將您從os.listdir()獲取的文件的路徑與腳本的目錄結合起來,並檢查這些路徑是否是用於創建文件列表的文件。

示例 -

def foo(): 
    filedir = os.path.dirname(__file__) 
    files = [f for f in (os.path.join(filedir, fil) for fil in os.listdir(filedir)) if os.path.isfile(f)] 
    print files 
    #do stuff here.... 
+1

這工作完美。我當然需要一個初始檢查我的 '在文件F:'' 如果f ==「file1.py」:'' pass' ,發現我不得不改變文件檢查 '如果f =='./folder1/file1.py':' 這與建議'一致。'是引用主要駐留的文件夾。謝謝! – abgordon