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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 02:36:00  来源:igfitidea点击:

ValueError: invalid literal for int() with base 10: '\n'

python

提问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 linecould possibly contain Tab or Space or Linefeed.

您只检查line[0]是数字,然后将整行转换为startline可能包含制表符或空格或换行符。

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/exceptapproach:

同样为了更干净的方法,你应该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/elifto avoid unnecessary ifchecking 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