Allen_Wu233 2022-07-02 14:44 采纳率: 50%
浏览 44
已结题

【Python提问】为什么这样会得到一个空列表?

问题遇到的现象和发生背景

在学习《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)一样的效果

感谢你的帮助!

  • 写回答

4条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-07-02 23:33
    关注

    原因很简单啊,csv读到的reader是迭代器,只能读取一次,阅后即焚。
    你先读取的是TAVG,读取完成后,reader里面就没有内容了,自然后面返回的都是空。不信你换个顺序,先执行TMAX或TMIN,看看是不是有数据了。
    最简单的办法,是把reader剩下的内容转成列表list:
    with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    reader = list(reader)
    可以在这个位置加这一句试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月12日
  • 已采纳回答 7月4日
  • 修改了问题 7月2日
  • 创建了问题 7月2日

悬赏问题

  • ¥15 韩国网站购物,KG支付的支付回调如何解决
  • ¥15 workstation导入ovf文件,报错,怎么解决呢?
  • ¥15 关于#c语言#的问题:构成555单稳态触发器,采用LED指示灯延时时间,对延时时间进行测量并显示(如楼道声控延时灯)需要Proteus仿真图和C语言代码
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,怎样解决呢?
  • ¥50 如何用单纯形法寻优不能精准找不到给定的参数,并联机构误差识别,给定误差有7个?matlab
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,没有XFS,怎样解决呢?
  • ¥15 应用商店如何检测在架应用内容是否违规?
  • ¥15 Ubuntu系统配置PX4
  • ¥50 nw.js调用activex
  • ¥15 数据库获取信息反馈出错,直接查询了ref字段并且还使用了User文档的_id而不是自己的