在Python 2中,我可以做这样的事情,
test = "6L"
print(long(test))
>>> 6
在PEP 237中,int
和long
是统一的。
现在,我的问题是,如果我有一个数据库,其中包含Python 2 long
表示形式作为字符串,如何在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中寻找的行为(如果可能)。
答案 0 :(得分:1)
如果您已经在数据库中存储了字符串文字,那么只需使用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类型,而不是数据库中的文字值。
它们不会简单地“复制并粘贴”数据库中的值。在您的评论中,您提到了this question,特别是这段代码:
{'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
是字符串文字; L
的数据库列类型很可能是字符或字符串类型。
此示例来自Python 2,因此L
,如果您针对Python 3运行相同的代码,则结果中将不会看到mysql>
。
要确认此行为,请使用任何其他客户端(例如proxy
客户端)访问数据库,您将看到该值未存储为九零一零零一零零零零L ,而是数据库列表示的本机类型。