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