Python - split()生成ValueError

时间:2017-03-24 17:41:49

标签: python csv split

我正试图拆分这条线:

American plaice - 11,000 lbs @ 35 cents or trade for SNE stocks

单词or,但收到ValueError: not enough values to unpack (expected 2, got 1)

这是没有意义的,如果我在or分开句子,那么确实会留下2边,而不是1。

这是我的代码:

if ('-' in line) and ('lbs' in line):
    fish, remainder = line.split('-') 
    if 'trade' in remainder:
        weight, price = remainder.split('to ')
        weight, price = remainder.split('or')

'to'行是我通常使用的,并且它运行良好,但是这个新行没有'to'而是'or',所以我尝试写一行解决任何一个条件,但无法弄明白所以我只是写了一秒钟,现在我遇到了上面列出的错误。

感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

最直接的方法可能是使用正则表达式来进行拆分。然后你可以分开任何一个单词,无论哪个出现。括号内的?:使得组无法捕获,因此匹配的单词不会出现在输出中。

import re
# ...
weight, price = re.split(" (?:or|to) ", remainder, maxsplit=1)

答案 1 :(得分:1)

这可以通过检查分隔符是否首先在字符串中来解决您的问题。

另请注意,split(str, 1)会确保您的列表最多可以拆分一次(Ex "hello all world".split(" ", 1) == ["hello", "all world"]

if ('-' in line) and ('lbs' in line):
    fish, remainder = line.split('-') 
    if 'trade' in remainder:
        weight, price = remainder.split(' to ', 1) if ' to ' in remainder else remainder.split(' or ', 1)

答案 2 :(得分:1)

在尝试拆分'to '之前,您在'or'上拆分,这会导致错误。 remainder.split('to ')的返回值为[' 11,000 lbs @ 35 cents or trade for SNE stocks'],无法解压缩为两个单独的值。你可以通过测试你需要首先拆分的单词来解决这个问题。

if ('-' in line) and ('lbs' in line):
    fish, remainder = line.split('-') 
    if 'trade' in remainder:
        if 'to ' in remainder:
            weight, price = remainder.split('to ')
        elif ' or ' in remainder:
            weight, price = remainder.split(' or ') #add spaces so we don't match 'for'

答案 3 :(得分:0)

完成split()后,您有一个列表,而不是字符串。所以你不能做另一个split()。如果您只是复制该行,那么您将覆盖其他结果。您可以尝试以字符串形式进行处理:

weight, price = remainder.replace('or ', 'to ').split('to ')

答案 4 :(得分:0)

问题在于"对于"还包含"或"因此,你最终会得到以下结论:

a = 'American plaice - 11,000 lbs @ 35 cents or trade for SNE stocks'
a.split('or')

给出

['American plaice - 11,000 lbs @ 35 cents ', ' trade f', ' SNE stocks']

Stephen Rauch的回答确实解决了这个问题