我有一个基于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.tar
、incomingData1.tar
中的下一个可用文件名,依此类推。只要os.open(..., O_CREAT | O_EXCL)
是原子的(通常是原子的),操作就是原子的。
对于Python 2,不支持开放模式'x'
,但可以使用fileName.tar
0来模拟行为。在Python 3中,mode='xb'
就足够了。
我为我的查询找到了一个更简单的破解解决方案。与@dhke的解决方案相反,我在函数open_next_file
中使用了一个简单的for循环。
逻辑
-
当函数被调用时,启动一个for循环,使用人们认为足够的范围。
-
检查目标文件夹中是否有相同格式的文件名。如果文件名不存在,则将数据写入其中,并中断for循环
-
如果文件名存在,什么也不做,因为你不想覆盖任何收到的文件
代码
# 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.txt
到incomingData4.txt
的空文件。
在运行上述代码后,在文件夹中创建一个新文件incomingData5.txt
。
并且在CCD_ 18时我得到CCD_。
备注
我给出了一个使用incomingFile.tar
0但.tar
作为template
变量的例子,并且使用wb
作为open()
的参数也应该起作用。