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 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥100 已有python代码,要求做成可执行程序,程序设计内容不多
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答