我有:
raw_matrix.append([])
for as_string in ' '.split(line):
if as_string:
print('as_string: #' + as_string + '#')
raw_matrix[-1].append(int(as_string))
Run Code Online (Sandbox Code Playgroud)
这会产生输出:
as_string: # #
Traceback (most recent call last):
File "product_of_four", line 27, in <module>
raw_matrix[-1].append(int(as_string))
ValueError: invalid literal for int() with base 10: ''
Run Code Online (Sandbox Code Playgroud)
raw_matrix是一个20x20的两行(十进制)数字行,由空格分隔.
如果我正确读取这个,as_string正在评估为''或'',并且我得到一个异常,因为as_string的副作用不可解析,因为它的副作用是不包含int() - 可解析的数字字符串.
我如何更改内容以便Python 2.x(3.x)解析一串两位数的整数,而不是尝试将不可解析的字符串解析为整数?
谢谢,
这条线:
for as_string in ' '.split(line):
Run Code Online (Sandbox Code Playgroud)
这里非常腥.您在' '
分隔符上拆分字符串line
,很可能返回列表[' ']
.请记住,字符串仅在空(0个字符)时评估为False-y值.该字符串' '
不为空(它有一个字符).
你可能想做类似的事情:
for as_string in line.split():
...
Run Code Online (Sandbox Code Playgroud)
它会line
在连续的空格中分开.
你使用错误的方式分开; 拆分线,而不是' '
空间:
for as_string in line.split(' '):
Run Code Online (Sandbox Code Playgroud)
通过用line
分隔符分割空格字符,你总是会最终得到[' ']
,而不是空字符串:
>>> ' '.split('10 20 30')
[' ']
Run Code Online (Sandbox Code Playgroud)
(异常是一个空的分隔符,不允许,并且拆分' '
,这会给你两个空字符串).并且结果中唯一的元素' '
是非空字符串,因此在布尔上下文中为True.
至于错误消息,int()
忽略前导和尾随空格.剩下的是一个空字符串:
>>> int(' ')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
Run Code Online (Sandbox Code Playgroud)
您可能想要甚至省略' '
参数wen splitting并在可变宽度空白上拆分:
for as_string in line.split():
Run Code Online (Sandbox Code Playgroud)
将第一个参数设置为默认值,None
.使用str.split()
也会忽略任何前导和尾随空格,在从文件中读取行时总是很方便,这些内容包括换行符:
>>> ' 10 20\t30\n'.split()
['10', '20', '30']
Run Code Online (Sandbox Code Playgroud)
从文档:
如果未指定sep或者是
None
,则应用不同的拆分算法:连续空格的运行被视为单个分隔符,如果字符串具有前导或尾随空格,则结果将在开头或结尾处不包含空字符串.因此,将空字符串或仅包含空格的字符串与None
分隔符分开返回[]
.