在创建文件名时使用变量

时间:2012-09-11 03:09:45

标签: python file

我是python的新手,我想知道是否有办法将变量放入文件名中,这样你就可以每次都创建不同名称的文件。

在我的特定情况下,我想在文件名中添加日期和时间。如果有可能,这将完美地运作:

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

......但事实并非如此。有没有办法使用不同的方法来获得这种功能?我尝试过使用多种措辞来寻找答案,但是我找不到答案,或者就此而言。

先谢谢你们。

编辑:那应该是一个open()函数,相应调整。

4 个答案:

答案 0 :(得分:4)

这应该有效。 format()会使用格式化的{0}字符串(datetime)替换字符串中的占位符datestr

>>> 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>

答案 1 :(得分:1)

修改您的答案仍然使用旧式%格式,您可以这样做:

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

请注意,我调用了open(),这可能是您想要做的(否则您只是创建一个元组)。此外,使用%s格式说明符会自动将参数转换为字符串,因此您不需要str()

答案 2 :(得分: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相对较新,我建议你保持小步骤,直到你对一般情况更加满意为止。

答案 3 :(得分: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,您可以使用经典选项:

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