Да, вам нужно перебрать строки.Это конструкция, которую вы ищете:
with open("fishweights.txt") as fo:
for line in fo:
pass
Теперь для извлечения каждого фрагмента каждой строки вы можете использовать line.split()
.Чтение фиксированного числа байтов (как вы это сделали) хорошо, если предположить, что идентификаторы имеют фиксированную длину.Вы уверены, что каждый идентификатор всегда будет иметь ровно 4 цифры?Что-то вроде этого может быть лучше:
raw_data = []
with open("fishweights.txt") as fo:
for line in fo:
row = line.strip().split()
if not row:
continue # ignore empty lines
id = int(row[0])
no = float(row[1])
raw_data.append((id, no))
Теперь, когда у вас есть необработанные данные, вам нужно их агрегировать:
sum = 0
count = 0
for id, no in raw_data:
sum += no
count += 1
avg = sum / count
или однострочный
avg = sum(no for id, no in raw_data) / len(raw_data)
и, наконец, вам необходимо сопоставить идентификаторы с именами для окончательной печати:
id_to_name = {
1000: 'Chemo',
1100: 'Greene',
1200: 'Toddy',
}
for id, no in raw_data:
print(id, id_to_name[id], no)
print('Average: ', avg)
Конечно, все три цикла можно объединить в один цикл.Я разделил его так, чтобы вы могли четко видеть каждый этап кода.Окончательный (и немного оптимизированный) результат может выглядеть так:
id_to_name = {
1000: 'Chemo',
1100: 'Greene',
1200: 'Toddy',
}
sum = 0
count = 0
with open("fishweights.txt") as fo:
for line in fo:
row = line.strip().split()
if not row:
continue # ignore empty lines
id = int(row[0])
no = float(row[1])
sum += no
count += 1
print(id, id_to_name[id], no)
print('Average:', sum/count)