詳解Python讀取和寫(xiě)入操作CSV文件的方法
最流行的數(shù)據(jù)交換格式之一是 CSV 格式。是需要通過(guò)鍵盤(pán)和控制臺(tái)以外的方式將信息輸入和輸出的程序,通過(guò)文本文件交換信息是在程序之間共享信息的常用方法。
這里帶和我一起回顧學(xué)習(xí)如何使用 Python 從文本文件中讀取、處理和解析 CSV。
什么是 CSV 文件?
CSV 文件(逗號(hào)分隔值文件)是一種純文本文件,它使用特定的結(jié)構(gòu)來(lái)排列表格數(shù)據(jù)。因?yàn)樗且粋€(gè)純文本文件,所以它只能包含實(shí)際的文本數(shù)據(jù),換句話說(shuō)就是可打印的ASCII或Unicode字符。
CSV 文件的結(jié)構(gòu)由其名稱給出。通常 CSV 文件使用逗號(hào)分隔每個(gè)特定數(shù)據(jù)值。
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
注意每條數(shù)據(jù)是如何用逗號(hào)分隔的。通常第一行標(biāo)識(shí)每條數(shù)據(jù)換句話說(shuō),就是數(shù)據(jù)列的名稱。之后的每一行都是實(shí)際數(shù)據(jù),并且受文件大小限制。
通常分隔符(,)逗號(hào)不是唯一使用的。其他流行的分隔符包括制表符 ( \t)、冒號(hào) ( : ) 和分號(hào) ( ; ) 字符。
正確解析 CSV 文件需要知道正在使用哪個(gè)分隔符。
CSV 文件從何而來(lái)?
CSV 文件通常由處理大量數(shù)據(jù)的程序創(chuàng)建。它們是從電子表格和數(shù)據(jù)庫(kù)中導(dǎo)出數(shù)據(jù)以及在其他程序中導(dǎo)入或使用數(shù)據(jù)的便捷方式。例如可以將數(shù)據(jù)挖掘程序的結(jié)果導(dǎo)出為 CSV 文件,然后將其導(dǎo)入電子表格以分析數(shù)據(jù)、生成圖表以進(jìn)行演示或準(zhǔn)備發(fā)布報(bào)告。
CSV 文件非常容易以 Python編程方式處理,可以直接處理 CSV 文件。
內(nèi)置 CSV 庫(kù)解析 CSV 文件
csv庫(kù)專為使用 Excel 生成的 CSV 文件開(kāi)箱即用而設(shè)計(jì),并且適應(yīng)各種 CSV 格式。
讀取 CSV 文件csv
CSV 文件使用 Python 的內(nèi)置 open() 函數(shù)作為文本文件打開(kāi),該函數(shù)返回一個(gè)文件對(duì)象,然后將其傳遞給 reader 執(zhí)行讀取工作。
# employee_birthday.txt name,department,birthday John,IT,November Tom,IT,March
讀取操作代碼,返回的每一行reader都是一個(gè)元素列表,String其中包含通過(guò)刪除分隔符找到的數(shù)據(jù)。返回的第一行包含以特殊方式處理的列名。
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
除了處理單個(gè)String元素的列表,還可以將 CSV 數(shù)據(jù)直接讀入字典。
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參數(shù)
delimiter 指定用于分隔每個(gè)字段的字符。默認(rèn)值為逗號(hào) ( ’ , ')。
quotechar 指定用于包圍包含分隔符的字段的字符。默認(rèn)值為雙引號(hào) ( ’ " ')。
escapechar 指定用于轉(zhuǎn)義分隔符的字符,以防不使用引號(hào)。默認(rèn)是沒(méi)有轉(zhuǎn)義字符。
name,address,date joined john,1132 Anywhere Lane Hoboken NJ, 07030,Jan 4 erica,1234 Smith Lane Hoboken NJ, 07030,March 2
此 CSV 文件包含三個(gè)字段:name、address和date joined,它們由逗號(hào)分隔。問(wèn)題是該 address 字段的數(shù)據(jù)還包含一個(gè)逗號(hào)來(lái)表示郵政編碼。
有三種方法可以處理這個(gè)。
- 使用不同的分隔符,使用delimiter可選參數(shù)來(lái)指定新的分隔符。
- 將數(shù)據(jù)括在引號(hào),選擇的分隔符的特殊性質(zhì)在帶引號(hào)的字符串中會(huì)被忽略。quotechar 可以使用可選參數(shù)指定用于引用的字符。
- 轉(zhuǎn)義數(shù)據(jù)中的分隔符,轉(zhuǎn)義字符的工作方式與它們?cè)诟袷阶址械淖饔靡粯樱箤?duì)被轉(zhuǎn)義字符(在本例中為分隔符)的解釋無(wú)效。如果使用轉(zhuǎn)義字符,則必須使用 escapechar 可選參數(shù)指定。
使用 csv 寫(xiě)入文件
可以使用 writer 對(duì)象和 .write_row() 方法寫(xiě)入 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對(duì)象只引用那些包含特殊字符。
csv.QUOTE_ALL: writer對(duì)象引用所有字段,如字段分隔符,quotechar或任何字符 lineterminator。
csv.QUOTE_NONNUMERIC: writer對(duì)象引用所有非數(shù)字字段,指示讀者將所有非引用字段轉(zhuǎn)換為float類型。
csv.QUOTE_NONE: writer對(duì)象不引用字段,如未設(shè)置escapechar錯(cuò)誤拋出;指示reader不對(duì)引號(hào)字符執(zhí)行特殊處理。
John Smith,Accounting,November Erica Meyers,IT,March
從字典中寫(xiě)入 CSV 文件csv
編寫(xiě)字典時(shí)需要 DictReader 參數(shù)。
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 庫(kù)解析 CSV 文件
可以先安裝 pandas 庫(kù)。
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 文件,這樣索引序號(hào)就沒(méi)有了。
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
修復(fù)Hire Date字段的數(shù)據(jù)類型為日期數(shù)據(jù)。
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
也可以統(tǒng)一進(jìn)行處理。
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 寫(xiě)入 CSV 文件
寫(xiě)入操作和讀取操作一樣簡(jiǎn)單。
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')
到此這篇關(guān)于詳解Python讀取和寫(xiě)入操作CSV文件的方法的文章就介紹到這了,更多相關(guān)Python讀取寫(xiě)入CSV內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch 更改預(yù)訓(xùn)練模型網(wǎng)絡(luò)結(jié)構(gòu)的方法
今天小編就為大家分享一篇pytorch 更改預(yù)訓(xùn)練模型網(wǎng)絡(luò)結(jié)構(gòu)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python控制windows剪貼板,向剪貼板中寫(xiě)入圖片的實(shí)例
今天小編就為大家分享一篇python控制windows剪貼板,向剪貼板中寫(xiě)入圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python Jieba分詞處理詳解【模式,詞庫(kù)的添加、刪除,自定義詞庫(kù),失敗處理等】
這篇文章主要介紹了python Jieba分詞處理,結(jié)合實(shí)例形式詳細(xì)分析了python 使用jieba分詞的模式,詞庫(kù)的添加、刪除,自定義詞庫(kù),失敗處理等相關(guān)操作技巧,需要的朋友可以參考下2023-07-07深入理解python中sort()與sorted()的區(qū)別
Python list內(nèi)置sort()方法用來(lái)排序,也可以用python內(nèi)置的全局sorted()方法來(lái)對(duì)可迭代的序列排序生成新的序列。這篇文章主要介紹了python中sort()與sorted()的區(qū)別,需要的朋友可以參考下2018-08-08python執(zhí)行l(wèi)inux系統(tǒng)命令的三種方式小結(jié)
本文介紹三種在python執(zhí)行l(wèi)inux命令的方式,三種方式都是基于python的標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn),因此不需要額外安裝第三方庫(kù),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02詳解基于Jupyter notebooks采用sklearn庫(kù)實(shí)現(xiàn)多元回歸方程編程
這篇文章主要介紹了詳解基于Jupyter notebooks采用sklearn庫(kù)實(shí)現(xiàn)多元回歸方程編程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python中random模塊生成隨機(jī)數(shù)詳解
本文給大家匯總了一下在Python中random模塊中最常用的生成隨機(jī)數(shù)的方法,有需要的小伙伴可以參考下2016-03-03Linux環(huán)境下的Python打包和部署實(shí)踐
這篇文章主要介紹了Linux環(huán)境下的Python打包和部署實(shí)踐的相關(guān)資料,需要的朋友可以參考下2023-11-11