「已注销」 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 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)