在 Python 3 中转换 Python 2 的长表示形式



在Python 2中,我可以做这样的事情,

test = "6L"
print(long(test))
>>> 6

在PEP 237中,intlong是统一的。

现在,我的问题是,如果我有一个包含 Python 2long表示为字符串的数据库,我如何在 Python 3 中将其转换回int

在 Python 3 中,

test = "6L"
print(int(test)) #since no long type
>>> ValueError: invalid literal for int() with base 10: '6L'

那么,他们是处理这个问题的内置方法吗?我的意思是我知道我可以去删除字符串版本的尾随'L'6L,但对于这个简单的任务来说,这似乎是一件令人讨厌的事情。

编辑

只是为了澄清@BurhanKhalid评论。如示例中所示,这些存储为字符串文本。在Python 2中,可以直接强制转换它们,这就是我在Python 3中寻找的行为(如果可能的话(。

如果您在数据库中存储了字符串文字,那么除了使用 Python 2 访问数据库、转换为 long 并正确存储它们之外,除了字符串解析之外,没有其他方法。

您可以使用正则表达式,或者如果最后一个字符L,则直接删除该字符。

try:
value = int(possible_long)
except ValueError:
if possible_long[-1] == 'L':
value = int(possible_long[:-1]) # this can still raise an exception,
# but we need to raise at this point
# as the value isn't a string repr of float

通常,您无需担心类型转换。Python 数据库驱动程序将确保返回的数据对于所使用的 Python 版本具有正确的类型。

但是,您必须在查询字符串中提供正确的表示形式才能转换值。如果使用字符串串联,则不会从此行为中受益。

当您print数据库调用的结果时,您看到的是转换后的值,并且看到的是 Python 类型,而不是数据库中的文本值。

它们不是简单地从数据库中"复制和粘贴"值。在您的评论中,您提到了这个问题,特别是这段代码:

{'estimated': '', 
'suffix': '', 
'typeofread': 'g', 
'acct_no': 901001000L, 
'counter': 0, 
'time_billed': datetime.datetime(2012, 5, 1, 9, 5, 33), 
'date_read': datetime.datetime(2012, 3, 13, 23, 19, 45), 
'reading': 3018L, 
'meter_num': '26174200'}

这是数据库驱动程序为您执行的类型转换的结果。您在此处看到的是 Python 数据类型等效项,用于从数据库接收的值。

901001000L是 Python long 类型,用于从数据库接收的数据。您可以分辨它不是字符串文字,因为它没有被引用,不像'26174200'被引用,因此是字符串文字;meter_num的数据库列类型很可能是字符或字符串类型。

此示例来自 Python 2,因此L,如果您对 Python 3 运行相同的代码,您将不会在结果中看到L

若要确认此行为,请使用任何其他客户端(如mysql>客户端(访问数据库,您将看到该值不是存储为 9 零零零10 零零 L而是存储为数据库列表示的本机类型。

最新更新