如何在Python中存储具有新名称的传入文件



我有一个基于python3的实现,其中检查传入数据,并将最终结果存储在具有固定名称的文件中。

with open(fileName.tar, 'wb') as f:
    f.write(dumpIncomingData)

对于例如CCD_ 2,CCD_。问题是每次检测到新的传入数据时,文件都会被重写,这不是我想要的。我希望每次写的文件都写在不同的文件中,即:

  • incomingData1.tar

  • incomingData2.tar。。。

我该如何以蟒蛇般的方式执行这个想法?

代码段

 from os import chdir
 PATH = '/tmp/'
 FILENAME = 'incomingData.tar'

 while True:
       Do some processes
       if(condition = True):
            print("file decoded")
            chdir(PATH)
            with open(FILENAME, 'wb') as f:
                 f.write(dumpData)
            break

dumpData是我正在使用的模块的一个函数,这里不应该关注它。

为什么不直接计算序列号,直到找到可用的文件名?

from itertools import count
import os
def open_next_file(template='incomingData{serial}.tar'):
    for filename in (template.format(serial=serial) for serial in count()):
        try:
            return open(filename, 'xb')
        except OSError:
            if not os.path.exists(filename):
                raise

这将产生一个打开的文件,文件名为序列incomingData0.tarincomingData1.tar中的下一个可用文件名,依此类推。只要os.open(..., O_CREAT | O_EXCL)是原子的(通常是原子的),操作就是原子的。

对于Python 2,不支持开放模式'x',但可以使用fileName.tar0来模拟行为。在Python 3中,mode='xb'就足够了。

我为我的查询找到了一个更简单的破解解决方案。与@dhke的解决方案相反,我在函数open_next_file中使用了一个简单的for循环。

逻辑

  1. 当函数被调用时,启动一个for循环,使用人们认为足够的范围。

  2. 检查目标文件夹中是否有相同格式的文件名。如果文件名不存在,则将数据写入其中,并中断for循环

  3. 如果文件名存在,什么也不做,因为你不想覆盖任何收到的文件

代码

 # Function to generate subsequent file with number suffix
 from os import chdir, path
 def open_next_file(template='incomingData{}.txt'):
        for serial in range(10):
            if not path.exists(template.format(serial)):
                 # if filename does not exist create on and write in it
                 with open(template.format(serial), 'w') as f:
                     f.write("hello %s n" %str(serial)) # write stuff..
                 break # once the file is written break free
            else:
                # if filename found do nothing
                # don't want to overwrite on existing files
                pass
 def main():
       chdir('/tmp/')
       open_next_file()
if __name__ == "__main__":
       main()

测试

我将使用在/tmp/中预先定义incomingDatax.txt

 touch incomingData{0..4}.txt

这将在文件夹中创建从incomingData0.txtincomingData4.txt的空文件。

在运行上述代码后,在文件夹中创建一个新文件incomingData5.txt

并且在CCD_ 18时我得到CCD_。

备注

我给出了一个使用incomingFile.tar0但.tar作为template变量的例子,并且使用wb作为open()的参数也应该起作用。

相关内容

  • 没有找到相关文章

最新更新