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

时间:2018-06-22 13:00:31

标签: python python-3.x python-2.7

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

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

PEP 237中,intlong是统一的。

现在,我的问题是,如果我有一个数据库,其中包含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中寻找的行为(如果可能)。

1 个答案:

答案 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 ,而是数据库列表示的本机类型。