Python 从具有标头的CSV文件中查找行的总和
当用户输入玩家id时,需要找到用户的平均分数 csv文件: 姓名部落id分数1分数2分数3分数4Python 从具有标头的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
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))