【轉載】Python處理csv文件

Python處理csv文件

CSV(Comma-Separated Values)即逗號分隔值,可以用Excel打開查看。由於是純文本,任何編輯器也都可打開。與Excel文件不同,CSV文件中:

  • 值沒有類型,所有值都是字符串
  • 不能指定字體顏色等樣式
  • 不能指定單元格的寬高,不能合併單元格
  • 沒有多個工作表
  • 不能嵌入圖像圖表

在CSV文件中,以,作爲分隔符,分隔兩個單元格。像這樣a,,c表示單元格a和單元格c之間有個空白的單元格。依此類推。

不是每個逗號都表示單元格之間的分界。所以即使CSV是純文本文件,也堅持使用專門的模塊進行處理。Python內置了csv模塊。先看看一個簡單的例子。

從CSV文件中讀取數據

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    print(list(reader))

data不能直接打印,list(data)最外層是list,裏層的每一行數據都在一個list中,有點像這樣

[['name', 'age'], ['Bob', '14'], ['Tom', '23'], ...]

於是我們可以這樣訪問到Bob的年齡reader[1][1], 在for循環中遍歷如下

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    for row in reader:
        # 行號從1開始
        print(reader.line_num, row)

截取一部分輸出

1 ['AKST', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF', 'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity', ' Mean Humidity', ' Min Humidity', ' Max Sea Level PressureIn', ' Mean Sea Level PressureIn', ' Min Sea Level PressureIn', ' Max VisibilityMiles', ' Mean VisibilityMiles', ' Min VisibilityMiles', ' Max Wind SpeedMPH', ' Mean Wind SpeedMPH', ' Max Gust SpeedMPH', 'PrecipitationIn', ' CloudCover', ' Events', ' WindDirDegrees']
2 ['2014-1-1', '46', '42', '37', '40', '38', '36', '97', '86', '76', '29.95', '29.77', '29.57', '10', '8', '2', '25', '14', '36', '0.69', '8', 'Rain', '138']
...

前面的數字是行號,從1開始,可以用reader.line_num獲取。

要注意的是,reader只能被遍歷一次。由於reader是可迭代對象,可以使用next方法一次獲取一行。

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    # 讀取一行,下面的reader中已經沒有該行了
    head_row = next(reader)
    for row in reader:
        # 行號從2開始
        print(reader.line_num, row)

寫數據到csv文件中

有reader可以讀取,當然也有writer可以寫入。一次寫入一行,一次寫入多行都可以。

import csv

# 使用數字和字符串的數字都可以
datas = [['name', 'age'],
         ['Bob', 14],
         ['Tom', 23],
        ['Jerry', '18']]

with open('example.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in datas:
        writer.writerow(row)
        
    # 還可以寫入多行
    writer.writerows(datas)

如果不指定newline='',則每寫入一行將有一空行被寫入。上面的代碼生成如下內容。

name,age
Bob,14
Tom,23
Jerry,18
name,age
Bob,14
Tom,23
Jerry,18

DictReader和DictWriter對象

使用DictReader可以像操作字典那樣獲取數據,把表的第一行(一般是標頭)作爲key。可訪問每一行中那個某個key對應的數據。

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.DictReader(f)
    for row in reader:
        # Max TemperatureF是表第一行的某個數據,作爲key
        max_temp = row['Max TemperatureF']
        print(max_temp)

使用DictWriter類,可以寫入字典形式的數據,同樣鍵也是標頭(表格第一行)。

import csv

headers = ['name', 'age']

datas = [{'name':'Bob', 'age':23},
        {'name':'Jerry', 'age':44},
        {'name':'Tom', 'age':15}
        ]

with open('example.csv', 'w', newline='') as f:
    # 標頭在這裏傳入,作爲第一行數據
    writer = csv.DictWriter(f, headers)
    writer.writeheader()
    for row in datas:
        writer.writerow(row)
        
    # 還可以寫入多行
    writer.writerows(datas)

就先了解到這兒。

 
分類: Python
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章