0

我对python很陌生,想知道是否有任何方法可以将变量放入文件名中,以便您每次都可以创建具有不同名称的文件。

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

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

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

提前谢谢各位。

编辑:这应该是一个 open() 函数,并进行了相应调整。

4

4 回答 4

4

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

>>> 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>
于 2012-09-11T03:11:24.090 回答
1

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

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

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

于 2012-09-11T03:14:56.620 回答
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 比较陌生,我建议你保持你的小步骤分解,直到你对一般事情更舒服。

于 2012-09-11T03:25:04.337 回答
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")
于 2012-09-11T04:03:46.200 回答