【问题标题】:How do you increment file name in Python如何在 Python 中增加文件名
【发布时间】:2011-02-22 07:45:00
【问题描述】:

我正在尝试将大量需要分离到不同文件中的数据保存起来,就像这样 数据_1.dat 数据_2.dat 数据_3.dat data_4.dat

如何在 python 中实现?

【问题讨论】:

  • 对于简单的用例来说这可能是一种矫枉过正,但我​​编写了一个小型 python 库以线程安全和覆盖安全的方式执行此操作:pypi.python.org/pypi/seqfile

标签: python file-io


【解决方案1】:
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'

【讨论】:

  • 你应该 +10 使用itertools 编写这个作为生成器 ;)
  • @delnan:来吧,这不是伟大:)
  • @ncoghlan:我不同意生成器函数会更合适,至少在不了解将使用它的上下文的情况下不会。您的陈述有什么理由吗?
  • 命名函数优于 lambdas 的原因相同:它们可以被赋予一个文档字符串,更好地支持自省,更容易从堆栈跟踪中找到,等等。如果它们没有被创建和使用一步,通常值得多花一两行给它们起一个正确的名字。
  • @ncoghlan:一般是正确的,但似乎不适用于这种情况。对于这个简单的示例,您真的不需要文档字符串或自省。我认为将其作为生成器函数时,可读性实际上会受到影响。
【解决方案2】:
for i in range(10):
    filename = 'data_%d.dat'%(i,)
    print filename

【讨论】:

  • 它不需要是单例元组。你可以有filename = 'data_%d.dat' % i
  • 我养成了为格式字符串创建单例元组以消除语法歧义的习惯。即print '%d'%(i,), s。当您不想打印换行符时,它也会更清楚。但是,是的,% i 也可以。
  • 我明白了。我想为了清楚起见,这对我来说更容易理解:print '{:d} {}'.format(i,s) 作为您示例的等效但更冗长的版本....
【解决方案3】:

类似于 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 在 cmets 的回答中正确指出的那样,在简单的情况下不值得这样做 - 如果额外的灵活性有价值,则仅升级到完整的生成器。
【解决方案4】:

如果您采用 itertools 方式,为什么要将它与生成器表达式混合使用?

>>> import itertools as it
>>> fngen= it.imap("file%d".__mod__, it.count(1))
>>> next(fngen)
'file1'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多