我正在处理需要制作唯一和增量文件名的项目。我找到UUID制作唯一名称的最佳方法,但是增量已经没有答案。我们有这样的情况我们的列表将会根据保存的文件重新启动后重新创建。并通过添加到上一个列表创建新文件 我尝试过的程序很简单:
import uuid
print(uuid.uuid4().hex)
print(uuid.uuid4().hex)
print(uuid.uuid4().hex)
print(uuid.uuid4().hex)
和样本输出是这样的:
e497b7d7651341e0ac214fea8c408a7b
5d956a98724c459796ef1fce3818ff45
e60f2517ac1a430eab84768dae9e49a1
9df26e765dee4c3197c2f5a69e210046
(这个结果与跑步完全不同)
正如你所看到的那样,没有保证新的UUID会比之前的更大/更小。
我想要的是像Sql Server中的NEWSEQUENTIALID
提前谢谢你;)
答案 0 :(得分:2)
如果我理解正确,这是XY Problem的一个例子。你想要的是文件名是唯一的和增量的(在第一个文件名到达第二个之后,依此类推)。
这意味着您不需要随机文件名,只需要一个未重复使用的文件名。
我建议使用
这样的方案YYYYMMDD_HHmmSS_IDX
其中YYYY
是年份,MM
是月份,DD
是一天,HH
小时(基于24),mm
分钟,SS
秒;所有这些数据都代表程序实例的开始时间(所以在开始时你在当前时间初始化一个变量并且从不更新它)。如果需要,所有这些数据都是0填充的(例如,如果早上9:08,那么该字段将是09和08)。
IDX
字段是增量索引(例如,0填充的3位数索引),每次需要创建新文件时都会更新(000开头,001后,等等)上)。
这将是增量的,而且还存储一些其他信息(例如日期的开始时间)。它将是唯一的,除非您在同一秒内启动两个实例(然后您还可以添加一个毫秒计数器)
编辑:
如果您没有任何获取时间的方法(没有RTC,没有GPS,没有互联网,没有),您只需要使用计数器来决定模式,例如:
myfile_XXXXXX
其中XXXXXX
是一个前导零和数字足以让你永远不会超过最大值的数字。
然后您有两个选项:列出所有文件,选择最后一个并递增,或存储计数器的先前值。
在第一种情况下,您有一些选择。例如,this answer使用glob
(您只需对其进行排序,例如使用以下语法:sorted(glob.glob('/ path / to / files / myfile_ *'))。这将返回你是一个清单;选择最后一个,删除第一部分,以便只有数字,然后递增它。
第二种方法更容易但需要您创建另一个文件。在此文件中,您只需存储当前编号,并在创建新文件时将其保存回来。您甚至可以将其设置为一个设置文件(您还可以存储文件的路径和各种选项)。如果您想要提供更多信息而不仅仅是数字,请考虑使用更结构化的文件,例如XML或JSON文件。
第一种方式不易出错,更自动。第二个更容易实现。
答案 1 :(得分:1)
您是否尝试过uuid.uuid1()
?
它有一个时间组件,因此可以订购生成的uuids。
来自文档:
从主机ID,序列号和当前时间生成UUID。
默认节点参数使用机器的MAC地址,因此同时运行代码的多台机器永远不会生成相同的uuid。
答案 2 :(得分:1)
您可以使用文件保存最后一个号码。下次你可以阅读这个文件和++。
答案 3 :(得分:0)
你不能。 install RandomLib算法基于哈希。它不能是增量的。
此外,UUID类型4是完全随机的。