python用定界符分割字符串,只有它在引号之外

时间:2019-05-30 17:00:31

标签: python csv parsing

我的字符串具有以下格式:

string = 'token1 -token2 +"token 3"'

我要提取标记和字段,如下所示:

result = [
    'token1',
    '-token2',
    '+token 3'
]

我正在为此使用csv模块,但未成功获取最后一个令牌为'+"token', '3"'

# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv

f = StringIO('token1 -token2 +"token 3"')

tokens = csv.reader(f, delimiter=' ', doublequote=False, quotechar='"', quoting=csv.QUOTE_NONE)

for t in tokens: print(t)
# > ['token1', '-token2', '+"token', '3"']

2 个答案:

答案 0 :(得分:1)

我为这种特殊情况编写了一个客户拆分器,因为格式太具体了。下面的代码可以很好地用于所提供的输入。

# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv

f = StringIO('token1 -token2 +"token 3"')

def check_and_split(line):
    tokens = []
    is_quote = False
    token = ''
    for c in line:
        if c == ' ' and (not is_quote):
            is_quote = False
            tokens.append(token)
            token = ''
        elif c == '"':
            is_quote = True
        else:
            token += c
    tokens.append(token)
    return tokens


for line in f:
    tokens = check_and_split(line)
    for t in tokens: 
        print(t)

输出:

token1
-token2
+token 3

答案 1 :(得分:0)

csv不能将+"token 3"识别为单个值,因为引号并不包含整个内容。因此,请确保他们这样做:

line = line.replace('+"', '"+')

,然后将csv.QUOTE_NONE更改为csv.QUOTE_MINIMAL(或只需删除quoting arg)。