【问题标题】:Generate always unique ID every-time it called with Python每次使用 Python 调用时都生成唯一的 ID
【发布时间】:2019-01-14 15:06:23
【问题描述】:

创建python脚本的最佳方法是什么,通过调用which,它总是会生成一个新的唯一ID(自动增量)

你运行脚本,它会告诉你 1,然后关闭脚本并再次打开,它会告诉你 2。

它的目的是创建一个脚本,该脚本将被使用,该 ID 将用于跟踪最新的更改等。

附:我不是说要制作一个可以做到的功能。

【问题讨论】:

  • 你自己有没有尝试过?
  • 如果您想将此脚本作为独立工具运行,它会根据您使用的操作系统有不同的答案。如果您计划让数据库与您的脚本一起运行,您可以使用数据库工具(例如,在 PostgreSQL 中使用 SEQUENCEnextval)。如果你有 zookeeper 等共识平台,可以使用 Zookeeper 和 Curator 生成。
  • 看看uuid 模块。
  • @Kevin SO抱歉,如果它看起来像这样,用自动增量编写代码这很容易......我的问题是关于如何存储这个值。例如,我创建了python脚本并编写了自动递增值的函数,但是在我关闭它之后记录丢失了。所以我需要某种单点,所有其他 python 脚本都将使用它。我目前只能看到创建例如文本文件的方式,该文本文件将存储值并每次更新文本中的值。但我相信有一个适当的方法来做到这一点。
  • @Kevin - P.S.我可以自己写脚本,我只需要背后的理论,使用什么方法。

标签: python uid


【解决方案1】:
import uuid

uniqueid = uuid.uuid1()

【讨论】:

    【解决方案2】:

    由于你没有提供任何代码,我也不提供任何代码。

    解决方案 1:唯一 ID

    1) TIME:创建函数给你时间戳

    2) ID:创建生成带有随机数字和字母的长字符串的函数

    • 这当然是“有风险的”,因为您有可能会生成已经存在的 ID,但从统计的角度来看,这就是所谓的“即使有可能也不可能”

    保存在文件中或某处

    解决方案 2:偏移 - 增量

    1) 文件中有一个 0。

    2) 打开文件,读取行,转换为整数,递增到+1,写入文件。

    注意:

    你的标题是错误的。前一刻你在谈论 UNIQUE ID,下一刻你在谈论偏移量。唯一 ID 和计数运行 python 脚本是很矛盾的想法

    【讨论】:

    • 我需要一个单点,它通过调用总是生成新的自动增量 ID。这将允许跟踪更改等。
    【解决方案3】:

    我假设你有一个脚本,它每次执行都会产生一些结果。然后,您需要一个值,该值 (1) 将一个结果与另一个结果区分开来,并且 (2) 显示哪个结果最后出现。那正确吗?如果是这样,我们在这里有很多选择。在最简单的情况下(始终在同一台机器上运行的脚本)我会建议两个选项

    将计数保存到文件

    在这种情况下,您将拥有一个文件并从中读取数字:

    try:
        with open('count.txt') as count_file:
            content = count_file.read()
            count = int(content)
    except Exception:
        count = 0
    

    在执行完脚本所做的任何事情后,您会将已读取但递增的值写入文件:

    with open('count.txt', 'w') as count_file:
        count_file.write(str(count + 1))
    

    保存时间戳

    然而,一个更简单的选择不是增加一个值,而是获取一个时间戳。您可以使用time.time(),它返回自Unix epoch 以来的秒数:

    >>> import time
    >>> time.time()
    1547479233.9383247
    

    您将永远知道哪个结果比其他结果来得晚。不过就个人而言,我更喜欢format the current time,它更容易阅读和推理:

    >>> from datetime import datetime
    >>> datetime.now().strftime('%Y%m%d%H%M%S')
    '20190114132407'
    

    这些是基本的想法,您可能需要注意极端情况和可能的失败(尤其是基于文件的解决方案)。也就是说,我想这些都是相当可行的第一步。

    技术说明

    您想要的是让程序在两次或多次执行之间记住一条信息,我们对此有一个技术术语:信息应该是持久的。由于您要求自动递增功能,因此您需要一个持久计数。但是,我怀疑如果您使用时间戳选项,则不需要这样做。在这里做什么由您决定。

    【讨论】:

    • 如果我在看什么,你解释的第一部分,这是我在 cmets 中提到的想法(非常抱歉解释不好)。您如何看待“这是最佳选择吗?”并发性如何?写入迷你数据库可能更好?最后我需要唯一的一段代码,它会生成唯一的 ID 并跟踪它,并且多个脚本可以使用它,但我认为简单地将它写入文件不是最好的选择
    【解决方案4】:

    我也有同样的情况。我最终创建了一个 CSV 文件,以便我可以映射变量名。

    def itemId_generator(itemIdLocation):
        # Importing value of ItemID from the csv file
        df = pd.read_csv(itemIdLocation)
    
        #return value which is current ItemID in the csv file
        ItemId = df.loc[0, 'ItemId']
    
        # If loop to set limit to maximum Item ID
        if ItemId>= 10000:
            df.loc[0, 'ItemId'] = 1
    
        elif ItemId<10000:
            # updating the column value/data
            df.loc[0, 'ItemId'] = df.loc[0,'ItemId'] + 1
        else:
            print("Invalid value returned")
            sys.exit()
    
        # writing new ItemID into the file
        df.to_csv(itemIdLocation, index=False)
    
        # The function .item() converts numpy integer to a normal int
        return str(ItemId.item())
    

    【讨论】:

      【解决方案5】:

      如果文件有可能被同时访问,最好锁定文件。如果文件被锁定,请继续尝试。

      http://tilde.town/~cristo/file-locking-in-python.html

      旧答案: 您可以将其作为环境变量存储在系统上。如果未设置,则初始化为 1。否则将其递增 1。

      【讨论】:

      • 嗯,进程不能修改调用者的环境。那么重启呢?请提供一些代码(或其他细节)来解释您的想法。
      猜你喜欢
      • 2013-10-01
      • 2015-09-25
      • 2013-08-16
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多