Python ValueError: 基数为 10 的 int() 的无效文字:'\n'
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28006027/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
ValueError: invalid literal for int() with base 10: '\n'
提问by Christopher Jakob
I am looking for an answer to this error with my specific code. I have searched the others and they are still so confusing.
我正在用我的特定代码寻找这个错误的答案。我已经搜索了其他人,但他们仍然很困惑。
I am unsure why this is happening.
我不确定为什么会这样。
Here is the code section that the error is referencing, followed by the error.
这是错误引用的代码部分,后跟错误。
def processScores( file, score):
#opens file using with method, reads each line with a for loop. If content in line
#agrees with parameters in if statements, executes code in if statment. Otherwise, ignores line
with open(file,'r') as f:
for line in f: #starts for loop for all if statements
if line[0].isdigit:
start = int(line)
score.initialScore(start) #checks if first line is a number if it is adds it to intial score
The error message I'm getting:
我收到的错误消息:
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
processScores('theText.txt',score)
File "C:/Users/christopher/Desktop/hw2.py", line 49, in processScores
start = int(line)
ValueError: invalid literal for int() with base 10: '\n'
Thanks everyone, I wouldn't be posting this if i didnt find a clear answer in the other posts
谢谢大家,如果我没有在其他帖子中找到明确的答案,我就不会发布这个
采纳答案by Anzel
This is giving you trouble:
这给你带来了麻烦:
edited: also as pointed by @PadraicCunningham, you're not calling the isdigit().. missing ()
编辑:也正如@PadraicCunningham 所指出的,你不是在调用 isdigit(.. missing ()
if line[0].isdigit():
start = int(line)
You're checking only line[0]
is digit and then convert the whole line to start
, the line
could possibly contain Tab or Space or Linefeed.
您只检查line[0]
是数字,然后将整行转换为start
,line
可能包含制表符或空格或换行符。
Try this instead: start = int(line[0])
试试这个: start = int(line[0])
Also for a cleaner approach, you should strip()each line you're checking, and for the safe side in case the data being passed are like "5k"
your logic needs to be a bit more SAFE, which you can use a try/except
approach:
同样为了更干净的方法,你应该strip()你正在检查的每一行,为了安全起见,如果传递的数据就像"5k"
你的逻辑需要更安全一些,你可以使用一种try/except
方法:
for line in f:
line = line.strip()
# edited: add `if line and ...` to skip empty string
if line and line[0].isdigit():
try:
start = int(line)
score.initialScore(start)
except ValueError:
# do something with invalid input
elif #... continue your code ...
As a side note, you should use if/elif
to avoid unnecessary if
checking if previous condition has already met.
作为旁注,如果先前的条件已经满足,您应该使用if/elif
以避免不必要的if
检查。
回答by Hackaholic
replace :
代替 :
start = int(line)
to
到
start = int(line.strip()) # strip will chop the '\n'
回答by Matt Consto
Alternatively, if you want to add the number instead of the first digit, you can use .strip() to remove any whitespace and newlines.
或者,如果您想添加数字而不是第一个数字,您可以使用 .strip() 删除任何空格和换行符。
if line.strip().isdigit():
start = int(line.strip())
score.initialScore(start) #checks if first line is a number if it is adds it to intial score
回答by Krishna
if the idea is to check the first line for a digit, how about using readlines instead of looping line by line; something like this.
如果想法是检查数字的第一行,如何使用 readlines 而不是逐行循环;像这样的东西。
I also think using regex is better
我也认为使用正则表达式更好
import re
def processScores( file, score):
#opens file using with method, reads each line with a for loop. If content in line
#agrees with parameters in if statements, executes code in if statment. Otherwise, ignores line
f = open(file,'r')
lines_list = f.readlines()
if bool(re.search("^-?\d*(\.\d+)?$",'-112.0707922')):
start = int(lines_list[0])
score.initialScore(start)
credit: regex borrowed from here https://stackoverflow.com/a/22112198/815677
信用:从这里借用的正则表达式https://stackoverflow.com/a/22112198/815677