首頁 > 軟體

詳解Python讀取和寫入操作CSV檔案的方法

2022-03-24 19:01:05

最流行的資料交換格式之一是 CSV 格式。是需要通過鍵盤和控制檯以外的方式將資訊輸入和輸出的程式,通過文字檔案交換資訊是在程式之間共用資訊的常用方法。

這裡帶和我一起回顧學習如何使用 Python 從文字檔案中讀取、處理和解析 CSV。

什麼是 CSV 檔案?

CSV 檔案(逗號分隔值檔案)是一種純文字檔案,它使用特定的結構來排列表格資料。因為它是一個純文字檔案,所以它只能包含實際的文字資料,換句話說就是可列印的ASCII或Unicode字元。

CSV 檔案的結構由其名稱給出。通常 CSV 檔案使用逗號分隔每個特定資料值。

column 1 name,column 2 name, column 3 name
1st row data 1,1st row data 2,1st row data 3
2nd row data 1,2nd row data 2,2nd row data 3

注意每條資料是如何用逗號分隔的。通常第一行標識每條資料換句話說,就是資料列的名稱。之後的每一行都是實際資料,並且受檔案大小限制。

通常分隔符(,)逗號不是唯一使用的。其他流行的分隔符包括製表符 ( t)、冒號 ( : ) 和分號 ( ; ) 字元。

正確解析 CSV 檔案需要知道正在使用哪個分隔符。

CSV 檔案從何而來?

CSV 檔案通常由處理大量資料的程式建立。它們是從電子試算表和資料庫中匯出資料以及在其他程式中匯入或使用資料的便捷方式。例如可以將資料探勘程式的結果匯出為 CSV 檔案,然後將其匯入電子試算表以分析資料、生成圖表以進行演示或準備釋出報告。

CSV 檔案非常容易以 Python程式設計方式處理,可以直接處理 CSV 檔案。

內建 CSV 庫解析 CSV 檔案

csv庫專為使用 Excel 生成的 CSV 檔案開箱即用而設計,並且適應各種 CSV 格式。

讀取 CSV 檔案csv

CSV 檔案使用 Python 的內建 open() 函數作為文字檔案開啟,該函數返回一個檔案物件,然後將其傳遞給 reader 執行讀取工作。

# employee_birthday.txt
name,department,birthday
John,IT,November
Tom,IT,March

讀取操作程式碼,返回的每一行reader都是一個元素列表,String其中包含通過刪除分隔符找到的資料。返回的第一行包含以特殊方式處理的列名。

import csv

with open('employee_birthday.txt') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'names are {", ".join(row)}')
            line_count += 1
        else:
            print(f't{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
            line_count += 1
    print(f'Processed {line_count} lines.')

names are name, department, birthday
	John works in the IT department, and was born in November.
	Tom works in the IT department, and was born in March.
Processed 3 lines.

將 CSV 檔案讀入字典csv

除了處理單個String元素的列表,還可以將 CSV 資料直接讀入字典。

import csv

with open('employee_birthday.txt', mode='r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        print(f't{row["name"]} works in the {row["department"]} department, and was born in {row["birthday month"]}.')
        line_count += 1
    print(f'Processed {line_count} lines.')


Column names are name, department, birthday
	John works in the IT department, and was born in November.
	Tom works in the IT department, and was born in March.
Processed 3 lines.

可選的 Python CSV reader引數

delimiter 指定用於分隔每個欄位的字元。預設值為逗號 ( ’ , ')。

quotechar 指定用於包圍包含分隔符的欄位的字元。預設值為雙引號 ( ’ " ')。

escapechar 指定用於跳脫分隔符的字元,以防不使用引號。預設是沒有跳脫字元。

name,address,date joined
john,1132 Anywhere Lane Hoboken NJ, 07030,Jan 4
erica,1234 Smith Lane Hoboken NJ, 07030,March 2

此 CSV 檔案包含三個欄位:name、address和date joined,它們由逗號分隔。問題是該 address 欄位的資料還包含一個逗號來表示郵政編碼。

有三種方法可以處理這個。

  • 使用不同的分隔符,使用delimiter可選引數來指定新的分隔符。
  • 將資料括在引號,選擇的分隔符的特殊性質在帶引號的字串中會被忽略。quotechar 可以使用可選引數指定用於參照的字元。
  • 跳脫資料中的分隔符,跳脫字元的工作方式與它們在格式字串中的作用一樣,使對被跳脫字元(在本例中為分隔符)的解釋無效。如果使用跳脫字元,則必須使用 escapechar 可選引數指定。

使用 csv 寫入檔案

可以使用 writer 物件和 .write_row() 方法寫入 CSV 檔案。

import csv

with open('employee_file.csv', mode='w') as employee_file:
    employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)

    employee_writer.writerow(['John Smith', 'Accounting', 'November'])
    employee_writer.writerow(['Erica Meyers', 'IT', 'March'])

csv.QUOTE_MINIMAL means only when required, for example, when a field contains either the quotechar or the delimiter
csv.QUOTE_ALL means that quotes are always placed around fields.
csv.QUOTE_NONNUMERIC means that quotes are always placed around
fields which do not parse as integers or floating point numbers.
csv.QUOTE_NONE means that quotes are never placed around fields.

csv.QUOTE_MINIMAL: writer物件只參照那些包含特殊字元。

csv.QUOTE_ALL: writer物件參照所有欄位,如欄位分隔符,quotechar或任何字元 lineterminator。

csv.QUOTE_NONNUMERIC: writer物件參照所有非數位欄位,指示讀者將所有非參照欄位轉換為float型別。

csv.QUOTE_NONE: writer物件不參照欄位,如未設定escapechar錯誤丟擲;指示reader不對引號字元執行特殊處理。

John Smith,Accounting,November
Erica Meyers,IT,March

從字典中寫入 CSV 檔案csv

編寫字典時需要 DictReader 引數。

import csv

with open('employee_file2.csv', mode='w') as csv_file:
    fieldnames = ['emp_name', 'dept', 'birth_month']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'emp_name': 'John Smith', 'dept': 'Accounting', 'birth_month': 'November'})
    writer.writerow({'emp_name': 'Erica Meyers', 'dept': 'IT', 'birth_month': 'March'})

使用 pandas 庫解析 CSV 檔案

可以先安裝 pandas 庫。

pip install pandas

pandas 讀取 CSV 檔案

# hrdata.csv
Name,Hire Date,Salary,Sick Days remaining
Graham Chapman,03/15/14,50000.00,10
John Cleese,06/01/15,65000.00,8
Eric Idle,05/12/14,45000.00,10
Terry Jones,11/01/13,70000.00,3
Terry Gilliam,08/12/14,48000.00,7
Michael Palin,05/23/13,66000.00,8

使用 pandas 讀取 csv 檔案。

import pandas as pd
df = pd.read_csv('hrdata.csv')
print(df)
             Name Hire Date   Salary  Sick Days remaining
0  Graham Chapman  03/15/14  50000.0                   10
1     John Cleese  06/01/15  65000.0                    8
2       Eric Idle  05/12/14  45000.0                   10
3     Terry Jones  11/01/13  70000.0                    3
4   Terry Gilliam  08/12/14  48000.0                    7
5   Michael Palin  05/23/13  66000.0                    8

增加索引列讀取 csv 檔案,這樣索引序號就沒有了。

import pandas as pd
df = pd.read_csv('hrdata.csv', index_col='Name')
print(df)
               Hire Date   Salary  Sick Days remaining
Name                                                  
Graham Chapman  03/15/14  50000.0                   10
John Cleese     06/01/15  65000.0                    8
Eric Idle       05/12/14  45000.0                   10
Terry Jones     11/01/13  70000.0                    3
Terry Gilliam   08/12/14  48000.0                    7
Michael Palin   05/23/13  66000.0                    8

修復Hire Date欄位的資料型別為日期資料。

import pandas as pd
df = pd.read_csv('hrdata.csv', index_col='Name', parse_dates=['Hire Date'])
print(df)
                Hire Date   Salary  Sick Days remaining
Name                                                   
Graham Chapman 2014-03-15  50000.0                   10
John Cleese    2015-06-01  65000.0                    8
Eric Idle      2014-05-12  45000.0                   10
Terry Jones    2013-11-01  70000.0                    3
Terry Gilliam  2014-08-12  48000.0                    7
Michael Palin  2013-05-23  66000.0                    8

也可以統一進行處理。

import pandas as pd
df = pd.read_csv('hrdata.csv', 
        index_col='Employee', 
        parse_dates=['Hired'], 
        header=0, 
        names=['Employee', 'Hired','Salary', 'Sick Days'])
print(df)
                    Hired   Salary  Sick Days
Employee                                     
Graham Chapman 2014-03-15  50000.0         10
John Cleese    2015-06-01  65000.0          8
Eric Idle      2014-05-12  45000.0         10
Terry Jones    2013-11-01  70000.0          3
Terry Gilliam  2014-08-12  48000.0          7
Michael Palin  2013-05-23  66000.0          8

pandas 寫入 CSV 檔案

寫入操作和讀取操作一樣簡單。

import pandas as pd
df = pd.read_csv('hrdata.csv', 
        index_col='Employee', 
        parse_dates=['Hired'],
        header=0, 
        names=['Employee', 'Hired', 'Salary', 'Sick Days'])
df.to_csv('hrdata_modified.csv')

到此這篇關於詳解Python讀取和寫入操作CSV檔案的方法的文章就介紹到這了,更多相關Python讀取寫入CSV內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com