【问题标题】:Ignore commas when enclosed in double quotes用双引号括起来时忽略逗号
【发布时间】:2019-05-30 00:55:47
【问题描述】:

我想扩展下面的代码,以便它可以使用双引号。例如,字符串'303,"Candy, Original",45,19' 应该返回[303,"Candy, Original",45,19]。请帮忙。谢谢。

def parse(s):
    #If string can be parsed as integer, return integer
    try:
        num = int(s)
        return num
    except:
        pass
    #Else return string
    return s

data=[parse(x) for x in myString.split(",")]

【问题讨论】:

  • 这听起来像是csv 模块应该能够处理的事情
  • csv 可能会处理这种情况,请参阅前面的this question,了解如何使用该模块处理带引号的分隔符。但我们需要看到更好的 minimal reproducible example 代码和示例输入。
  • @DavidZemens : 你介绍了" " 而不是原来的' '
  • @Sheldore 你是对的! ¯_(ツ)_/¯

标签: python string split


【解决方案1】:

csv 模块可以很好地处理带引号的逗号。您可能想尝试围绕它构建一个解析器。

import csv
from io import StringIO

def to_numeric(x):
    try:
        return int(x)
    except ValueError:
        pass
    try:
        return float(x)
    except ValueError:
        pass
    return x

def parse_line(s):
    f = StringIO(s)
    f.seek(0)
    reader = csv.reader(f)
    out = next(reader)
    return [to_numeric(x) for x in out]

s = '303,"Candy, Original",45,19'
parse_line(s)
# returns:
[303, 'Candy, Original', 45, 19]

【讨论】:

    【解决方案2】:

    使用 CSV 的解决方案:

    $ python
    Python 3.7.2 (default, Dec 27 2018, 07:35:06) 
    [Clang 10.0.0 (clang-1000.11.45.5)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import csv
    >>> from io import StringIO
    >>> csv_string = '303,"Candy, Original",45,19'
    >>> csv_file = StringIO(csv_string)
    >>> 
    >>> reader = csv.reader(csv_file, delimiter=',')
    >>> reader.__next__()
    ['303', 'Candy, Original', '45', '19']
    

    然后,如果需要,您可以通过 intfloat 强制传递每个值以获取本机数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 2015-10-23
      • 2013-06-22
      • 2011-05-31
      • 2018-04-14
      • 2017-04-07
      • 2014-02-26
      相关资源
      最近更新 更多