【问题标题】:What would be the best way to generate IDs to make rows individual?生成 ID 以使行独立的最佳方法是什么?
【发布时间】:2017-06-14 06:16:44
【问题描述】:

为了从 csv 文件中删除特定行,我想为我的行添加一个 ID 值。当然,有几种方法可以做到这一点,我希望能提供一些关于生成 ID 的可能方法的意见。简单而简短但好的方法是首选。

例如使用random.randint(00000, 99999) 可能是一个随机大数字?但是需要检查可能的重复项会让我觉得有更好的解决方案。

另一种方法是读取 csv 文件,将 1 添加到每行的某个变量中。也许您甚至需要想办法检查给定的行是否包含实际的 csv 内容,而不仅仅是\n 的结果。我试过这个并取得了成功,但代码真的很长而且很丑。

我敢打赌,我想不出更好的方法。我的尝试可以在下面找到。它适用于我的特定行管理和添加新行的方式。这就是我现在的习惯。

如果目前还不明显,我正在寻找 Python 3+ 的解决方案。

import os

def ID(filename):
    if os.path.isfile(filename):
        if os.path.getsize() == 0:
            return 1
        else:
            ID = 1
            [ID += 1 for line in open(filename, "r")]
            return ID
    else:
        return 1

【问题讨论】:

  • 如果您在 ID 的开头添加几个字母可能会更明显:myID1、myID2、myID3 ... 添加前导零也可以提高可读性:myID00001。我的ID00002 ...
  • 这些 ID 的用途是什么?了解这一点将有助于确定合适或最佳的技术。
  • @martineau 一些小程序可以添加/删除/列出条目,例如,您为跟踪它而服用的药物。或食物/卡路里。类似的东西。这就是为什么 16 位密钥不适合的原因。您应该可以通过 argparse 轻松删除它。以--remove 1232 为例。

标签: python python-3.x csv uniqueidentifier


【解决方案1】:

使用 v4 UUID

import uuid

ID = uuid.uuid4().hex

它是随机的,并且在大多数实际应用中保证是唯一的。

【讨论】:

  • 由于用户应该能够通过--remove <ID> 手动删除行,这并不理想,但很高兴知道该模块存在。
  • @xvx 如果是这样的话,看起来你应该使用像 sqlite 这样的数据库引擎,而不是 csv 文件。
【解决方案2】:

计算行数不是一个好主意,因为如果您从文件中间删除一行,然后尝试查找新 ID,您最终可能会复制以前使用的 ID。

如果你保持文件按ID排序,你可以在最后一行的ID上加1。

或者,您可以使用uuid 生成足够随机的标识符,您不必担心冲突。

【讨论】:

    【解决方案3】:

    用这样的方式生成唯一的 N 位随机数是相当容易的:

    import random
    
    _seen = set()
    def uniqueID(length):
        while True:
            v = int(''.join(str(random.randint(0, 9)) for _ in range(length)))
            if v not in _seen:
                _seen.add(v)
                return v
    
    for _ in range(10):
        print(uniqueID(16))
    

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2015-12-14
      • 2011-02-19
      • 2014-01-31
      • 2020-10-05
      相关资源
      最近更新 更多