C語言中文網 目錄

Python讀取csv文件(詳解版,看了無師自通)

前面程序展示的數據都是直接通過程序給出的,但實際應用可能需要展示不同來源(比如文件、網絡)、不同格式(比如 csv、JSON)的數據,這些數據可能有部分是損壞的,因此程序需要對這些數據進行處理。

csv 文件格式的本質是一種以文本存儲的表格數據(使用 Excel 工具即可讀寫 csv 文件)。csv 文件的每行代表一行數據,每行數據中每個單元格內的數據以逗號隔開。

Python 提供了 csv 模塊來讀寫 csv 文件。由于 csv 文件的格式本身比較簡單(通常第一行是表頭,用于說明每列數據的含義,接下來每行代表一行數據),因此使用 csv 模塊讀取 csv 文件也非常簡單:
  • 創建 csv 模塊的讀取器。
  • 循環調用 csv 讀取器的 next() 方法逐行讀取 csv 文件內容即可。next() 方法返回一個 list 列表代表一行數據,list 列表的每個元素代表一個單元格數據。

本節使用的是 2017 年廣州天氣數據的 csv 文件(數據來源于 http://lishi.tianqi.com/ 網站。下面程序示范了使用 csv 讀取器來讀取 csv 文件的兩行內容。
import csv

filename = 'guangzhou-2017.csv'
# 打開文件
with open(filename) as f:
    # 創建cvs文件讀取器
    reader = csv.reader(f)
    # 讀取第一行,這行是表頭數據。
    header_row = next(reader)
    print(header_row)
    # 讀取第二行,這行是真正的數據。
    first_row = next(reader)
    print(first_row)
上面程序中第 7 行代碼創建了 CSV 讀取器,第 9 行、第 12 行代碼各讀取文件的一行,其中第 7 行代碼會返回 csv 文件的表頭數據;第 9 行代碼會返回真正的數據。

運行上面程序,可以看到如下輸出結果:

['Date', 'Max TemperatureC', 'Min TemperatureC', 'Description', 'WindDir', 'WindForce']
['2017-1-1', '24', '13', '晴', '西南風', '1級']

從上面的輸出結果可以看到,該文件的每行包含 6 個數據,分別是日期、最高溫度、最低溫度、天氣情況、風向、風力。

掌握了 csv 讀取器的用法之后,下面程序將會使用 Matplotlib 來展示 2017 年 7 月廣州的最高氣溫和最低氣溫。
import csv
from datetime import datetime
from matplotlib import pyplot as plt

filename = 'guangzhou-2017.csv'
# 打開文件
with open(filename) as f:
    # 創建cvs文件讀取器
    reader = csv.reader(f)
    # 讀取第一行,這行是表頭數據。
    header_row = next(reader)
    print(header_row)
    # 定義讀取起始日期
    start_date = datetime(2017, 6, 30)
    # 定義結束日期
    end_date = datetime(2017, 8, 1)
    # 定義3個list列表作為展示的數據
    dates, highs, lows = [], [], []
    for row in reader:
        # 將第一列的值格式化為日期
        d = datetime.strptime(row[0], '%Y-%m-%d')
        # 只展示2017年7月的數據
        if start_date < d < end_date:
            dates.append(d)
            highs.append(int(row[1]))
            lows.append(int(row[2]))

# 配置圖形
fig = plt.figure(dpi=128, figsize=(12, 9))
# 繪制最高氣溫的折線
plt.plot(dates, highs, c='red', label='最高氣溫',
    alpha=0.5, linewidth = 2.0, linestyle = '-', marker='v')
# 再繪制一條折線
plt.plot(dates, lows, c='blue', label='最低氣溫',
    alpha=0.5, linewidth = 3.0, linestyle = '-.', marker='o')
# 為兩個數據的繪圖區域填充顏色
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
# 設置標題
plt.title("廣州2017年7月最高氣溫和最低氣溫")
# 為兩條坐標軸設置名稱
plt.xlabel("日期")
# 該方法繪制斜著的日期標簽
fig.autofmt_xdate()
plt.ylabel("氣溫(℃)")
# 顯示圖例
plt.legend()
ax = plt.gca()
# 設置右邊坐標軸線的顏色(設置為none表示不顯示)
ax.spines['right'].set_color('none')
# 設置頂部坐標軸線的顏色(設置為none表示不顯示)
ax.spines['top'].set_color('none')
plt.show()
上面程序的前半部分代碼用于從 csv 文件中讀取 2017 年 7 月廣州的氣溫數據,程序分別使用了 dates、highs 和 lows 三個 list 列表來保存日期、最高氣溫、最低氣溫。

程序的后半部分代碼繪制了兩條折線來顯示最高氣溫和最低氣溫,其中第 31 行代碼用于繪制最高氣溫,第 34 行代碼用于繪制最低氣溫;第 37 行代碼控制在兩條折線之間填充顏色。程序也對坐標軸、圖例進行了簡單的設置。

運行上面程序,可以看到如圖 1 所示的折線圖。

2017 年7 月廣州的氣溫折線圖
圖 1 2017 年7 月廣州的氣溫折線圖

程序也可以使用 Pygal 來統計 2017 年廣州的天氣匯總情況,比如統計出陰天、晴天、多云天和雨天各占多少天。程序會使用 csv 讀取器讀取 2017 年廣州陰天、晴天、多云天和雨天共有多少天,然后將這些數據添加到 pygal.Pie 對象中即可繪制餅圖。該程序的代碼如下:
import csv
import pygal

filename = 'guangzhou-2017.csv'
# 打開文件
with open(filename) as f:
    # 創建cvs文件讀取器
    reader = csv.reader(f)
    # 讀取第一行,這行是表頭數據。
    header_row = next(reader)
    print(header_row)
    # 準備展示的數據
    shades, sunnys, cloudys, rainys = 0, 0, 0, 0
    for row in reader:
        if '陰' in row[3]:
            shades += 1
        elif '晴' in row[3]:
            sunnys += 1
        elif '云' in row[3]:
            cloudys += 1
        elif '雨' in row[3]:
            rainys += 1
        else:
            print(rows[3])
# 創建pygal.Pie對象(餅圖)
pie = pygal.Pie()
# 為餅圖添加數據
pie.add("陰", shades)
pie.add("晴", sunnys)
pie.add("多云", cloudys)
pie.add("雨", rainys)
pie.title = '2017年廣州天氣匯總'
# 設置將圖例放在底部
pie.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
pie.render_to_file('guangzhou_weather.svg')
上面程序的前半部分代碼也是用于從 csv 文件中讀取 2017 年廣州的天氣數據,該程序只讀取 csv 文件的數據行的第四列數據(天氣描述),并使用 shades、sunnys、cloudys、rainys 分別保存陰天、晴天、多云天和雨天的數據。

上面程序中建了一個 pygal.Pie 對象,該對象就表示一個餅圖。接下來向 pygal.Pie 對象添加數據。運行上面程序,可以生成如圖 2 所示的餅圖。

統計2017 年廣州天氣情況的餅圖
圖 2 統計2017 年廣州天氣情況的餅圖

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo