在学习《Python编程从入门到实践(第2版)》时,做练习16-5时遇到的一些问题
百度网盘链接:
链接:https://pan.baidu.com/s/1tsTyM4AYisb0r3Bm3DegnA
提取码:2333
CSDN链接:
https://download.csdn.net/download/Allen_Wu233/85863224
import csv
from datetime import datetime
import matplotlib.pyplot as plt
filename = 'data/shanghai_weather_2021.06.24-2022.06.24.csv'
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
def get_data(data_name):
"""获取数据"""
dates, data = [], []
date_index = header_row.index('DATE')
data_index = header_row.index(data_name)
if data_name in ('TAVG', 'TMAX', 'TMIN'):
for row in reader:
current_date = datetime.strptime(row[date_index], '%Y/%m/%d')
try:
datum = int(row[data_index])
except ValueError:
print(f"Missing data {data_name} for {current_date}")
else:
dates.append(current_date)
data.append(float("{:.1f}".format(5/9*(datum-32))))
# 将结果转换为摄氏度并保留一位小数
else:
for row in reader:
current_date = datetime.strptime(row[date_index], '%Y/%m/%d')
try:
datum = float(row[data_index])
except ValueError:
print(f"Missing data {data_name} for {current_date}")
else:
dates.append(current_date)
data.append(datum)
return dates, data
# 从文件中获取日期、降雨量、降雪量、平均温度、最高温度和最低温度
# precips = get_data('PRCP')
# snowfalls = get_data('SNWD')
avegs = get_data('TAVG')
highs = get_data('TMAX')
lows = get_data('TMIN')
# highs[0]为最高温度(TMAX)对应的日期(DATE),lows[0]、avegs[0]同理
print(highs)
print(lows)
print(len(highs[0]))
print(len(lows[0]))
print(len(avegs[0]))
print(len(highs[1]))
print(len(lows[1]))
print(len(avegs[1]))
([], [])
([], [])
0
0
366
0
0
366
***Repl Closed***
尝试定义函数get_data() 来处理多种数据,平均温度(TAVG)能正常获取,即元组avegs中的列表不为空列表,
但最高温度(TMAX)和最低温度(TMIN)不能正常获取,即元组highs、lows中的列表为空列表
获取最高温度(TMAX)和最低温度(TMIN)的数据,达到和获取平均温度(TAVG)一样的效果
感谢你的帮助!
原因很简单啊,csv读到的reader是迭代器,只能读取一次,阅后即焚。
你先读取的是TAVG,读取完成后,reader里面就没有内容了,自然后面返回的都是空。不信你换个顺序,先执行TMAX或TMIN,看看是不是有数据了。
最简单的办法,是把reader剩下的内容转成列表list:
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
reader = list(reader)
可以在这个位置加这一句试试
数据可以单独发一下嘛,这里下载要下载码
换成百度网盘了
链接:https://pan.baidu.com/s/1tsTyM4AYisb0r3Bm3DegnA
提取码:2333