我正在编写一个简单的程序,它使用mrjob库从csv文件中映射和减少行。
一行中的一列是yearID
。默认情况下,该列是作为Str读入的。我需要将其转换为Int,以便进行比较。由于某种原因,Str到Int的转换不能工作,并且有奇怪的行为。
ValueError: invalid literal for int() with base 10: 'yearID'
这个错误是由下面代码中的第29行if int(stat.get("yearID")) > 1990:
引起的:
from mrjob.job import MRJob
class MRPitching(MRJob):
def mapper(self, _, line):
row = line.split(",")
playerID = row[0]
whip = {
"p_H": row[13],
"p_BB": row[16],
"p_IPOUTS": row[12],
"yearID": row[1]
}
yield playerID, whip
def reducer(self, playerID, pitchingStats):
pHSum = 0
pBBSum = 0
pIPOUTSSum = 0
for stat in pitchingStats:
if int(stat.get("yearID")) > 1990:
yield playerID, stat
if __name__ == "__main__":
MRPitching.run()
由于某种原因,int()函数将yearID
作为参数,而它应该是stat.get("yearID")
的值。当我打印stat.get("yearID")
时,我看到的是期望值,所以我不明白为什么int()得到yearID
。
我忘记考虑映射数据中包含了CSV头。哦!
在添加一个检查以跳过标头后,转换按预期工作。