2012-11-18 64 views
0

我想使用xlwt自動保存電子表格時使用的文件名。假設在python程序運行的文件夾中有一個名爲Data的子目錄。我希望程序計算該文件夾中的文件數量(#= n)。然後文件名必須以(n + 1)結尾。如果文件夾中有0個文件,則文件名必須是Trial_1.xls。該文件必須保存在該子目錄中。Python自動文件名

我瞭解以下內容:

import xlwt, os, os.path 
n = len([name for name in os.listdir('.') if os.path.isfile(name)]) 

計數的文件在同一文件夾的數量。

a = n + 1 
filename = "Trial_" + "a" + ".xls" 
book.save(filename) 

這會將正確命名的文件保存到同一個文件夾中。

我的問題是我該如何擴展到一個子目錄?謝謝。

回答

2

os.listdir('.').此處指向執行文件的目錄。將.更改爲指向您感興趣的子目錄。

您應該從文件系統的根目錄中爲其指定完整路徑名稱;否則它將與腳本執行的目錄相關。這可能不是你想要的;特別是如果您需要從其他程序中引用子目錄時。

您還需要提供filename變量的完整路徑;其中將包括子目錄。

爲了使生活更輕鬆,只需設置變量的完整路徑並在需要時引用它。

TARGET_DIR = '/home/me/projects/data/' 
n = sum(1 for f in os.listdir(TARGET_DIR) if os.path.isfile(os.path.join(TARGET_DIR, f))) 
new_name = "{}Trial_{}.xls".format(TARGET_DIR,n+1) 
+0

'os.listdir'沒有給出一個完整路徑。只有基地名稱。 – jdi

+0

是的,固定,沒有理解就讓它好一點。 –

+0

完美的作品!我使用了TARGET_DIR ='data /',因爲它位於同一個文件夾中(我想我原來的問題並不清楚)。謝謝。另外,我注意到您使用.format()創建文件名的方式更有效率。你如何使用它?從未見過它。 – Jey

0

既然你說Burhan Khalid的回答「完美無缺!」你應該接受它。

我只是想指出一種不同的方法來計算數字。你這樣做的方式是有效的,但是如果我們想象你正在計算沙粒或者會使用太多的記憶。這裏是一個更直接的方式來獲得計數:

n = sum(1 for name in os.listdir('.') if os.path.isfile(name)) 

對於每一個符合條件的名,我們獲得了1,而所有這些1的獲得送入sum(),你會得到你的計數。

請注意,此代碼使用「生成器表達式」而不是列表理解。上面的代碼不是建立一個列表,而是放棄它的長度,然後放棄列表,上面的代碼只是迭代器來迭代以計算計數。

這有點低俗,但有一個快捷方式,我們可以使用:sum()將接受布爾值,並將True作爲1和False作爲0.我們可以總結這些。

# sum will treat Boolean True as a 1, False as a 0 
n = sum(os.path.isfile(name) for name in os.listdir('.')) 

這是非常棘手的,我可能不會使用這個沒有發表評論。但我相信這是用Python計算事物最快,最有效的方法。

+0

謝謝。沒有意識到有一個「接受」功能;我是這個網站的新手。完成:) – Jey

+0

@Jey你應該閱讀[如何提問FAQ條目](http://stackoverflow.com/faq#howtoask)。 –

3

你真正想要glob

from glob import glob  

DIR = 'some/where/' 
existing_files = glob(DIR + '*.xls') 
filename = DIR + 'stuff--%d--stuff.xls' % (len(existing_files) + 1) 
+0

這比使用'os.listdir'更合適,因爲glob會立即從擴展模式解析文件。不過,我會建議使用'os.glob1(DIR「的* .xls」)',使結果列表小得多(只有基本名稱),並使用'os.path.join'加盟的DIR和新的基本名稱。 – jdi