如何在Python中增量文件名

5
我正在尝试保存大量需要分离到不同文件中的数据,如下所示: data_1.dat data_2.dat data_3.dat data_4.dat
我该如何在Python中实现这一点?

这可能对于简单的用例来说有些过度,但我编写了一个小型的Python库以线程安全和覆盖安全的方式来执行此操作:https://pypi.python.org/pypi/seqfile - musically_ut
4个回答

13
from itertools import count
filename = ("data_%03i.dat" % i for i in count(1))
next(filename)
# 'data_001.dat'
next(filename)
# 'data_002.dat'
next(filename)
# 'data_003.dat'

1
你写成一个使用 itertools 的生成器,真是太棒了,值得加上 +10 分。 - user395760
@delnan:别这么夸张嘛,它也没那么好 :) - Sven Marnach
@ncoghlan:我不同意使用生成器函数会更合适,至少在不了解将要使用的上下文情况下是这样。你对此有什么理由吗? - Sven Marnach
1
具有相同原因的命名函数比Lambda更可取:它们可以被赋予文档字符串,更好地支持内省,更容易在堆栈跟踪中找到等。如果它们不是在单个步骤中创建和使用的,则通常值得额外花费一两行来给它们一个合适的名称。 - ncoghlan
通常是这样的,但似乎不适用于这种情况。对于这个简单的例子,您实际上不需要文档字符串或内省。我认为,将其变成生成器函数后,可读性实际上会受到影响。 - Sven Marnach
是的,你需要泛化文件名生成器才能使其有价值(请参见我的单独示例)。我还忘记了一个细节,即生成器表达式直接给你生成器迭代器,跳过生成器函数步骤,因此请撤回我的评论。 - ncoghlan

9
for i in range(10):
    filename = 'data_%d.dat'%(i,)
    print filename

它不需要是单例元组。你可以使用filename = 'data_%d.dat' % i - dawg
我已经养成了创建单例元组以消除语法歧义的习惯,例如 print '%d'%(i,), s。这也使得当你不想打印换行符时更加清晰明了。但是,% i 也可以起到同样的作用。 - yan
我明白了。为了更清晰,我猜这个版本对我来说更易懂:print '{:d} {}'.format(i,s),它相当于您示例中更冗长的版本... - dawg

0

类似于Sven的解决方案,但升级为完整的生成器:

from itertools import count
def gen_filenames(prefix, suffix, places=3):
    """Generate sequential filenames with the format <prefix><index><suffix>

       The index field is padded with leading zeroes to the specified number of places
    """
    pattern = "{}{{:0{}d}}{}".format(prefix, places, suffix)
    for i in count(1):
        yield pattern.format(i)

>>> g = gen_filenames("data_", ".dat")
>>> for x in range(3):
...     print(next(g))
... 
data_001.dat
data_002.dat
data_003.dat

正如Sven在他的回答评论中所指出的那样,在简单情况下这并不值得做 - 只有在额外的灵活性具有价值时才升级为完整的生成器。 - ncoghlan

0
如果你使用itertools的方式,为什么要与生成器表达式混合使用呢?
>>> import itertools as it
>>> fngen= it.imap("file%d".__mod__, it.count(1))
>>> next(fngen)
'file1'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接