【问题标题】:How to convert string with a delimiter to list of strings in Python?如何将带分隔符的字符串转换为 Python 中的字符串列表?
【发布时间】:2014-11-10 16:11:36
【问题描述】:

我正在查询数据库并获取以下文本:

"('username', '192.168.1.1', datetime.datetime(2013, 1, 3, 7, 18))"

我想分成这样的列表:

['username', '192.168.1.1', datatime.datetime(2013, 1, 3, 7, 18)]

那么,哪种方式是最好的方式?我正在使用 Python 2.4。

【问题讨论】:

  • 你想让 datetime.datetime(..) 成为一个 datetime 对象,还是应该保留一个字符串?
  • 日期时间在引号之间?因为这样一个简单的split 操作是行不通的。
  • 如果不是datetime 位,我建议thetext[1:-1].split(",") 这样做。也许您可以先使用regex 将括号内的逗号替换为其他内容(例如;)?
  • 您使用的是什么数据库,为什么会返回一个字符串?

标签: python string list datetime python-2.4


【解决方案1】:

一种方法是使用evallist

>>> import datetime
>>> string = "('username', '192.168.1.1', datetime.datetime(2013, 1, 3, 7, 18))"
>>> list(eval(string))
['username', '192.168.1.1', datetime.datetime(2013, 1, 3, 7, 18)]

eval 将字符串计算为 Python 表达式,这里生成一个包含两个字符串和一个 datetime 实例的元组。 list 将此元组转换为列表。


注意:eval 可能会执行任何有效的 Python 代码,甚至是恶意代码。如果您不确定是否信任数据库中的内容,可以使用更安全的替代方法,例如 ast.literal_eval

【讨论】:

  • eval 一样,除非输入是可信的,否则不安全。
【解决方案2】:

您可以使用split函数的maxsplit参数:

your_string = "('username', '192.168.1.1', datetime.datetime(2013, 1, 3, 7, 18))"
your_string[1:-1].split(",", 2)

# Returns:
# ["'username'", " '192.168.1.1'", ' datetime.datetime(2013, 1, 3, 7, 18)']

【讨论】:

    【解决方案3】:

    正如jonrsharpe 评论中所指出的,您似乎掉入了自己刚刚挖出的陷阱。

    任何正确的数据库都可以为您提供各个列,如果您正确执行查询,您将获得正确的格式。

    假设您可以使用PEP 249 中描述的 DB-API 2.0,并且假设 conn 是与您的数据库的开放连接,您应该执行以下操作:

    curs = conn.cursor()
    curs.execute('SELECT name, ip, dat FROM tab')
    t = curs.fetchone()
    

    t 应该直接是元组('username', '192.168.1.1', datatime.datetime(2013, 1, 3, 7, 18))(如果需要列表,请使用list(t) ...)

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2021-01-23
      • 2021-07-01
      相关资源
      最近更新 更多