2012-09-11 39 views
0

我對Python非常陌生,想知道是否有任何方法將變量放入文件名中,以便每次都可以創建具有不同名稱的文件。在創建文件名時使用變量

在我的特殊情況下,我想爲文件名添加日期和時間。如果可能的話,這可以很好地工作:

example = open("Path/to/file%s", "w") % str(datetime.now()) 

......但它沒有。有什麼方法可以使用不同的方法來獲得這種功能?我嘗試過使用多個短語搜索答案,但是我無法找到答案。

在此先感謝你們。

編輯:這應該是一個開放()函數,相應地進行了調整。

+1

你這樣的工作,但你會移到旁邊路徑的元組,像'例如=(「路徑/到/文件%s」%STR( datetime.now()),「w」)' – sberry

回答

4

這應該工作。 format()將用格式化的datetime字符串(datestr)替換佔位符{0}

>>> from datetime import datetime 
>>> datestr = datetime.strftime(datetime.today(), "%Hh %Mm %Ss %A, %B %Y") 
>>> examplefile = open("/home/michael/file{0}".format(datestr), 'w') 
>>> print(examplefile) 
<open file '/home/michael/file21h 20m 34s Monday, September 2012', mode 'w' at 0x89fcf98> 
+0

很好的回答;不幸的是我喜歡寫作,就像我在製作一個元組。它看起來不像製作文件的工作,我得到「無效模式或文件名」例外。 – Daniel

+0

@Daniel我不確定你的意思是「寫成就像我在製作一個元組」。我已經用一個工作示例更新了答案。希望有所幫助。 :) – 2012-09-11 04:05:43

+0

啊,這是冒號。有沒有辦法以不同的格式獲取日期,還是需要手動編輯它們?例如,我現在正在尋找更類似於: – Daniel

1

修改你的答案仍然使用舊式%格式,你可以這樣做:

example = open("Path/to/file%s" % datetime.now(), "w") 

請注意,我叫open(),這可能是你想要做什麼(否則你'只是創建一個元組)。此外,使用%s格式說明符自動將參數轉換爲字符串,因此您並不需要str()

1

你的例子不起作用的原因與文件無關。

example = ("Path/to/file%s", "w") % str(datetime.now()) 

上面使用%操作者與左邊的元組,並在右側的字符串。但%運算符用於基於字符串模板構建字符串,該字符串模板出現在%的左側。把一個元組放在左邊只是沒有意義。

你需要打破你想要做的更多的基本步驟。您從「我想打開名稱包含當前日期和時間的文件」開始。沒有辦法直接做到這一點,這就是爲什麼你找不到它的原因。但是文件名只是一個字符串,所以你可以使用字符串操作來構建一個字符串,然後打開該字符串。所以你的問題並不是真正的「如何在名稱中打開一個包含日期/時間的文件?」,而是「我如何將日期/時間和其他一些信息一起放入一個字符串?」。您似乎已經知道該問題的答案:使用%格式。

這是有道理的;否則我們不得不爲文件和字符串實現每個可能的字符串操作。也適用於我們使用字符串的其他所有內容。這不是方式(理智)編程的工作原理;我們希望能夠重用已經存在的操作,而不是每次都從頭開始。

因此,您所做的是使用字符串操作(與文件無關,既不知道也不在乎您最終將使用此字符串打開文件)來構建文件名。然後,將該字符串傳遞給文件打開函數open(以及"w"字符串以指定您希望它可寫)。

例如:

filename = "Path/to/file%s" % datetime.now() 
example = open(filename, "w") 

你可以把它放在一個行,如果你想:

example = open("Path/to/file%s" % datetime.now(), "w") 

但如果你是比較新的編程和Python的,我建議你把你的一般情況下,你會感覺更舒適一些。

+0

我確實有一些以前使用過Java的經驗,但事實確實如此,我有一種傾向於跳入事情的傾向。 = D我會盡量把你的建議放在心上。 – Daniel

+0

@Daniel:跳進來很棒!這是你學習的方式。但是,當你遇到問題時,幾乎總是找出如何做某件事情,而沒有什麼東西可以滿足你的需要,那就是這樣,因爲做「你需要做的事情」的方法是從更基本的操作中建立它,對此*有*現成的作品。 – Ben

0

這裏發佈的所有答案都能正確識別問題,即您的字符串格式不正確。

您還應該檢查您最終得到的字符串是否是您嘗試創建文件的操作系統的有效文件名。

您的例子並不產生在Windows上一個有效的文件名,雖然將工作在Linux上,創建的文件名會不會是你所期望的:

>>> f = open(str(datetime.datetime.now()),'w') 
>>> f.write('hello\n') 
>>> f.close() 
>>> quit() 

-rw-r--r-- 1 burhan burhan 6 Sep 11 06:53 2012-09-11 06:53:04.685335 

在Windows上不工作所有:

>>> open(str(datetime.datetime.now()),'w') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] invalid mode ('w') or filename: '2012-09-11 06:51:26.873000' 

這將是一個更好的選擇(2.6+):

filename = "Path/to/file/{0.year}{0.month}{0.day}".format(datetime.now()) 

對於舊版本Python中的sions,您可以使用經典的選項:

filename = "Path/to/file/%s" % datetime.strftime(datetime.now(),"%Y%m%d") 
+0

你是對的;問題由於datetime.now()格式化冒號而變差,所以我無法在名稱中創建一個包含該文件的文件。謝謝! – Daniel