Python 从具有标头的CSV文件中查找行的总和

Python 从具有标头的CSV文件中查找行的总和,python,Python,当用户输入玩家id时,需要找到用户的平均分数 csv文件: 姓名部落id分数1分数2分数3分数4 Aang Normad N321B 89 67 54 78 Gyatso Omaticay O111C 54 78 65 54 我尝试添加在SO上找到的一些内容,但出现了错误:以10为基数的int()的文本无效:“Score1”。如果有人能为我指出正确的方向,我将不胜感激,因为我刚刚开始学习python import csv filePath="data.csv" with open(file

当用户输入玩家id时,需要找到用户的平均分数

csv文件:

姓名部落id分数1分数2分数3分数4
Aang Normad N321B 89 67 54 78

Gyatso Omaticay O111C 54 78 65 54

我尝试添加在SO上找到的一些内容,但出现了错误:以10为基数的int()的文本无效:“Score1”。如果有人能为我指出正确的方向,我将不胜感激,因为我刚刚开始学习python

import  csv
filePath="data.csv"


with open(filePath) as csvfile:
    avatar_id=  input ("Enter Avatar ID:")    
    reader = csv.DictReader(csvfile)  
    for row in reader:
        if avatar_id in row['id']:
        #just print some stuff
            user,tribe,id, *scores= row 
            average= sum([int(score) for score in scores])/4
              print("{0:>6}{1:>8}{2:>7}{3:>7}{4:^14}".format(row['Air'],row['Water'],row['Earth'],row['Fire'], average))
            print("==============================") 
        else:
            x=5
if x>4:
    print('No avatar found')

你的错误准确地告诉你问题是什么。您的代码正在尝试将标题标签
Score1
转换为此行中的整数:

average= sum([int(score) for score in scores])/4
而且失败了。要避免在计算中包含标题标签,请测试
reader.line_num
跳过文件的第一行

或者,为了安全起见,忽略任何非数字数据:

if all(score.isdigit() for score in scores):
    average= sum([int(score) for score in scores])/4
替换

*scores= row


您需要为不存在的密钥添加额外的检查,并删除CSV文件中的空行。您还需要向csv.DictReader添加分隔符,因为它默认为逗号分隔符。参见下面的示例:

import  csv
import io
filePath="""name tribe id Score1 Score2 Score3 Score4
Aang Normad N321B 89 67 54 78
Gyatso Omaticay O111C 54 78 65 54
"""

avatar_id=  input ("Enter Avatar ID:")    
reader = csv.DictReader(io.StringIO(filePath),delimiter=' ')  
for row in reader:
    print(row)
    if avatar_id in row.get('id',''):
        user,tribe,id, *scores= row.values()
        average= sum([int(score) for score in scores])/4
        print("==============================") 
        break
    else:
        x=None
if x is None:
    print('No avatar found')
else:
    print("{} score is {}".format(avatar_id,x))

可能的dup:
user,tribe,id,*scores=row
应该是
user,tribe,id,*scores=row.values()
。如果您在每次迭代中都放置一个简单的
print(row)
,您将看到
row
s是dicts。我把这个问题标记为输入错误。有没有办法用csv文件跳过标题?好吧,我建议您测试
reader.line_num
,但我已经提出了另一种解决方案。
import  csv
import io
filePath="""name tribe id Score1 Score2 Score3 Score4
Aang Normad N321B 89 67 54 78
Gyatso Omaticay O111C 54 78 65 54
"""

avatar_id=  input ("Enter Avatar ID:")    
reader = csv.DictReader(io.StringIO(filePath),delimiter=' ')  
for row in reader:
    print(row)
    if avatar_id in row.get('id',''):
        user,tribe,id, *scores= row.values()
        average= sum([int(score) for score in scores])/4
        print("==============================") 
        break
    else:
        x=None
if x is None:
    print('No avatar found')
else:
    print("{} score is {}".format(avatar_id,x))