如何将Python UUID转换为字符串?

110

我需要能够为用户分配一个UUID,并将其记录在一个 .txt 文件中。这是我所拥有的全部内容:

import uuid

a = input("What's your name?")
print(uuid.uuid1())
f.open(#file.txt)

我尝试过:

f.write(uuid.uuid1())

但是没有任何结果显示,可能是一个逻辑错误,但我不知道。


你有没有看过 uuid 的文档? - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams,我对Python还很陌生,不好意思,但我不太确定你的意思。 - Alphin Philip
如果这确实是您的问题,您可以通过在 uuid 周围放置 str(...) 来将其更改为字符串。 - khelwood
因为输入是通过main获得的,所以被视为变量。尝试在重新输入时使用引号。同时,使用f=open("file.txt")而不是点。 - Eliethesaiyan
uuid.uuid4().hex怎么样?它返回一个32个字符的字符串。 - Greg
6个回答

222

你可以试试这个!

 a = uuid.uuid1()
 str(a)
 --> '448096f0-12b4-11e6-88f1-180373e5e84a'

12
谁给这个投了反对票?问题是“如何将UUID更改为字符串?”而这个答案完全回答了这个问题。它不会返回任何东西,因为它展示了如何将UUID转换为字符串表示形式。投+1票。 - Felipe
2
str(UUID)会始终返回一个由字母数字和破折号组成的字符串吗?我找不到关于UUID.__str__()的文档。或者,我需要使用类似于UUID.hex()UUID.urn()这样的方法来确保结果字符串中没有非可打印字符吗? - Adam Mlodzinski
1
@AdamMlodzinski 是的,来自官方 Python 文档 https://docs.python.org/3/library/uuid.html#module-uuid ,同时也可以查看 str 方法的源代码 https://github.com/python/cpython/blob/master/Lib/uuid.py#L279 - sumit

48

您也可以这样做。额外附带移除破折号的功能。文档链接

import uuid
my_id = uuid.uuid4().hex

ffba27447d8e4285b7bdb4a6ec76db5c

更新:裁剪掉连字符的UUID与完整UUID在功能上是相同的(讨论)。 完整UUID中的连字符始终位于相同位置(文章)。


谢谢您,先生。您有文档链接吗? - Rohan Devaki
1
如果我们移除破折号,这个值还会保持唯一吗? - Rohan Devaki
1
我已经编辑了我的答案,以使文档链接更加明显。 - andyw
1
根据去除破折号的影响,我更新了我的答案。 - andyw

4

我提出了一种不同的解决方案,用 Python 3.7 可以按照我的预期正常工作。

import uuid

uid_str = uuid.uuid4().urn
your_id = uid_str[9:]

urn 是根据 RFC 4122 规范,以URN形式表示的 UUID。


2
[更新] 我添加了str函数,以字符串形式编写并关闭文件,以确保立即执行,之前我必须终止程序,以便内容被写入。
 import uuid
 def main():
     a=input("What's your name?")
     print(uuid.uuid1())
 main()
 f=open("file.txt","w")
 f.write(str(uuid.uuid1()))
 f.close()

我想这对我来说可行


我尝试了这个,但它一直返回:TypeError: write() argument must be str, not UUID。 - Alphin Philip
@AlphinPhilip 我希望你那时已经修好了。 - Eliethesaiyan
不确定这对您是否重要,但在我看来,您打印的uuid1与您写入文件的uuid1不同,因为uuid.uuid1() != uuid.uuid1() - djvg
@Dennis,我正在提供替代方案...他可以打印出来或者生成一个字符串变量并将其写入...或者直接生成并写入。 - Eliethesaiyan

2

很可能是因为你没有真正关闭文件。这可能会导致问题。在处理文件时,除非你有充分的理由不这样做,否则应该使用上下文管理器/with块。

with open('file.txt', 'w') as f:
    # Do either this
    f.write(str(uuid.uuid1()))
    # **OR** this.
    # You can leave out the `end=''` if you want.
    # That was just included so that the two of these
    # commands do the same thing.
    print(uuid.uuid1(), end='', file=f)

这将在你完成操作后自动关闭文件,确保其已写入磁盘。

我尝试了这个,但它一直返回:TypeError: write() argument must be str, not UUID#。 - Alphin Philip
@AlphinPhilip 更新了我的答案 - 你可以选择任意一种。后者假设你正在运行python3.x+或已经运行了 from __future__ import print_function - Wayne Werner

0

f-string也可以:

import uuid

str_id = f'{uuid.uuid4()}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接