代码之家  ›  专栏  ›  技术社区  ›  scharette

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

  •  0
  • scharette  · 技术社区  · 6 年前

    在python 2中,我可以这样做,

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

    PEP 237 , int long 是统一的。

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

    在Python 3中,

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

    那么,它们是解决这个问题的内置方法吗?我是说我知道我可以把拖尾去掉 'L '在字符串版本的 6L ,但对于这个简单的任务来说,这似乎是一件令人讨厌的事情。

    编辑

    只是为了澄清@burhankhalid的评论。如在示例中那样,这些存储为字符串文字。在Python2中,可以直接转换它们,这是我在Python3中寻找的行为(如果可能的话)。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Burhan Khalid    6 年前

    如果在数据库中存储了字符串文本,那么就不必用Python 2访问数据库,转换为LoC并正确地存储它们,没有其他方法可以用于字符串解析。

    您可以使用正则表达式,或者简单地删除最后一个字符 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 是字符或字符串类型。

    这个例子来自python 2,因此 L 如果您在Python 3上运行相同的代码,您将看不到 L 在结果中。

    要确认此行为,请使用任何其他客户端(如 mysql> 客户端),您将看到该值未存储为 九零一零零一零零零零升 而是数据库列表示的本机类型。