解析时的EOF

时间:2013-07-24 18:36:26

标签: python python-3.x

def main():
    NUMBER_OF_DAYS = 10
    NUMBER_OF_HOURS = 24
    data = []
    for i in range(NUMBER_OF_DAYS):
        data.append([])
        for j in range(NUMBER_OF_HOURS):
            data[i].append([])
            data[i][j].append(0)
            data[i][j].append(0)
    for k in range(NUMBER_OF_DAYS * NUMBER_OF_HOURS):
        line = input().strip().split()
        day = eval(line[0])
        hour = eval(line[1])
        temperature = eval(line[2])
        humidity = eval(line[3])
        data[day - 1][hour - 1][0] = temperature
        data[day - 1][hour - 1][1] = humidity
    for i in range(NUMBER_OF_DAYS):
        dailyTemperatureTotal = 0
        dailyHumidityTotal = 0
        for j in range(NUMBER_OF_DAYS):
            dailyTemperatureTotal += data[i][j][0]
            dailyHumidityTotal += data[i][j][1]
        print("Day " + str(i) + "'s average temperature is" + str(dailyTemperatureTotal / NUMBER_OF_HOURS))
        print("Day " + str(i) + "'s average humidity is" + str(dailyHumidityTotal / NUMBER_OF_HOURS))

main()

好的,这让我很紧张。由于我面临的另一个错误,我似乎无法运行此代码。解析时这个EOF是什么?由于某种原因似乎突出显示day = eval (line[0]),我不知道为什么

2 个答案:

答案 0 :(得分:2)

这意味着line[0]由不完整的Python语句组成。空字符串可以做到这一点,例如:

>>> eval('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 0

    ^
SyntaxError: unexpected EOF while parsing

如果您的输入由整数组成,请使用int()代替更清晰的错误消息,并检查空行。

有更好的方法来构建您的数据结构;列表理解例如:

totals = [[0, 0] for _ in range(NUMBER_OF_DAYS)]

这种结构足以容纳所有总数;如果你可以每天对整个事物求和,那就没有必要保持每小时的价值。

我从stdin读取而不是使用input(),直接将每天的温度和湿度相加:

from itertools import islice
import sys

for line in islice(sys.stdin, NUMBER_OF_DAYS * NUMBER_OF_HOURS):
    day, hour, temperature, humidity = map(int, line.split())
    data[day - 1][0] += temperature
    data[day - 1][1] += humidity

并计算平均值:

for i, (temp, humidity) in enumerate(data):
    print("Day {}'s average temperature is {}".format(i,  temp / NUMBER_OF_HOURS))
    print("Day {}'s average humidity is {}".format(i,  humidity / NUMBER_OF_HOURS))

答案 1 :(得分:0)

看起来问题出在本节

for k in range(NUMBER_OF_DAYS * NUMBER_OF_HOURS):
        line = input().strip().split()
        day = eval(line[0])

我会假设您希望每次都有一个用户输入一个值而不是通过eval处理输入?

我不确定eval在做什么,但根据错误消息,line变量为空,或者len(line) == 0: True属性为line[0]不起作用。

如果你在python3中使用input(),与python2的input()不同,它总是以string的形式读取用户输入。所以它类似于python2的raw_input()函数。也许您的eval()函数缺少从strint的转换?但同样,我不确定eval()正在做什么。

也许只需插入

print("\n\nline: {}\n\n".format(line))

for k in range(NUMBER_OF_DAYS * NUMBER_OF_HOURS):
        line = input().strip().split()

我们会知道更多