简体   繁体   中英

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

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

This is giving you trouble:

edited: also as pointed by @PadraicCunningham, you're not calling the 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.

Try this instead: 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:

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.

replace :

start = int(line) 

to

start = int(line.strip())   # strip will chop the '\n' 

Alternatively, if you want to add the number instead of the first digit, you can use .strip() to remove any whitespace and newlines.

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

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM