首頁 > 軟體

Pandas對CSV檔案讀寫操作詳解

2022-04-11 19:00:58

什麼是 CSV 檔案

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

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

column 1 name,column 2 name, column 3 name
first row data 1,first row data 2,first row data 3
second row data 1,second row data 2,second row data 3
...

每條資料是如何用逗號分隔的。第一行為資料列的名稱,有的時候也可以為空第一行就是實際的資料。之後的每一行都是實際資料,僅受檔案大小限制。

CSV 檔案從何而來?

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

CSV 檔案非常容易以程式設計方式處理。任何支援文字檔案輸入和字串操作的語言(如 Python)都可以直接處理 CSV 檔案。

CSV 庫解析 CSV 檔案

csv 庫提供讀取和寫入 CSV 檔案的功能。專為使用 Excel 生成的 CSV 檔案開箱即用而設計,適應各種 CSV 格式。該 csv 庫包含物件和其他程式碼,用於從 CSV 檔案讀取、寫入和處理資料。

讀取 CSV 檔案

CSV 檔案使用 Python 的內建open()函數作為文字檔案開啟,該函數返回一個檔案物件。然後使用 reader 物件完成從 CSV 檔案中的讀取。

employee_birthday.txt

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

直接讀取的方法。

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'Column 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.')

字典方式讀取的方法。

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 month
    John Smith works in the Accounting department, and was born in November.
    Erica Meyers works in the IT department, and was born in March.
Processed 3 lines.

CSV reader 引數

reader 物件可以通過指定附加引數來處理不同樣式的 CSV 檔案。

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

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

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

employee_addresses.txt

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

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

思考一下這個應該怎麼處理?

CSV 檔案的寫入

CSV 檔案的寫入可以使用 .write_row() 方法進行操作。

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'])

quotechar 用來包圍含特殊字元的欄位,排除歧義使用。

quoting的幾種控制引號行為情況:

csv.QUOTE_NONNUMERIC) # 非數位加引號

csv.QUOTE_ALL # 所有欄位加引號

csv.QUOTE_MINIMAL # 特殊欄位加引號

csv.QUOTE_NONE # 都不加引號

字典方式寫入。

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'})

employee_file2.csv

emp_name,dept,birth_month
John Smith,Accounting,November
Erica Meyers,IT,March

使用 pandas 庫解析 CSV 檔案

pandas 是一個開源 Python 庫,提供高效能的資料分析工具和易於使用的資料結構,可以共用資料、程式碼、分析結果、視覺化和敘述性文字。

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可以快速的讀取。

import pandas
df = pandas.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

使用pandas讀取資料時可以格式化日期格式。

import pandas
df = pandas.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

pandas 寫入 CSV 檔案

讀取到 pandas 的內容可以直接寫入到新的 csv 檔案。

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

print(df)
Employee,Hired,Salary,Sick Days
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檔案讀寫操作詳解的詳細內容,更多關於Pandas讀寫CSV的資料請關注it145.com其它相關文章!


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