一、CSV概念
1、逗號分隔值(Comma-Separated Values,CSV),其文件以純文本形式存儲表格數據(數字和文本),文件的每一行都是一個數據記錄。每個記錄由一個或多個字段組成,用逗號分隔。使用逗號作為字段分隔符是此文件格式的名稱的來源,因為分隔字符也可以不是逗號,有時也稱為字符分隔值。
2、CSV廣泛用於不同體系結構的應用程序之間交換數據表格信息,解決不兼容數據格式的互通問題,一般按照傳輸雙方既定標准進行格式定義,而其本身並無明確格式標准。
3、CSV用逗號分隔字段的基本思想是清楚的,但是當字段數據也可能包含逗號或者甚至嵌入換行符時,該想法變得復雜。 CSV實現可能無法處理這些字段數據,或者可能會使用引號來包圍字段。引用並不能解決所有問題:有些字段可能需要嵌入引號,因此CSV實現可能包含轉義字符或轉義序列。
二、CSV的格式規范
具體文件格式:
1.每條記錄占一行 以逗號為分隔符
2.逗號前后的空格會被忽略
3.字段中包含有逗號,該字段必須用雙引號括起來
4.字段中包含有換行符,該字段必須用雙引號括起來
5.字段前后包含有空格,該字段必須用雙引號括起來
6.字段中的雙引號用兩個雙引號表示
7.字段中如果有雙引號,該字段必須用雙引號括起來
8.第一條記錄,可以是字段名
下面的格式規范定義來源於RFC 4180:
1. 每一行記錄位於一個單獨的行上,用回車換行符CRLF(也就是\r\n)分割。
1 aaa,bbb,ccc CRLF 2 zzz,yyy,xxx CRLF
2. 文件中的最后一行記錄可以有結尾回車換行符,也可以沒有。
1 aaa,bbb,ccc CRLF 2 zzz,yyy,xxx
3.第一行可以存在一個可選的標題頭,格式和普通記錄行的格式一樣。標題頭要包含文件記錄字段對應的名稱,應該有和記錄字段一樣的數量。(在MIME類型中,標題頭行的存在與否可以通過MIME type中的可選”header”參數指明)
1 field_name,field_name,field_name CRLF 2 aaa,bbb,ccc CRLF 3 zzz,yyy,xxx CRLF
4. 在標題頭行和普通行每行記錄中,會存在一個或多個由半角逗號(,)分隔的字段。整個文件中每行應包含相同數量的字段,空格也是字段的一部分,不應被忽略。每一行記錄最后一個字段后不能跟逗號。(通常用逗號分隔,也有其他字符分隔的CSV,需事先約定)
1 aaa,bbb,ccc
5. 每個字段可用也可不用半角雙引號(“)括起來(不過有些程序,如Microsoft的Excel就根本不用雙引號)。如果字段沒有用引號括起來,那么該字段內部不能出現雙引號字符。
1 "aaa","bbb","ccc" CRLF 2 zzz,yyy,xxx
6. 字段中若包含回車換行符、雙引號或者逗號,該字段需要用雙引號括起來。
1 "aaa","b CRLF 2 bb","ccc" CRLF 3 zzz,yyy,xxx
7. 如果用雙引號括字段,那么出現在字段內的雙引號前必須加一個雙引號進行轉義。
1 "aaa","b""bb","ccc"
三、CSV文件解析
CSV並不是一種單一的、定義明確的格式,因此在實踐中,術語“CSV”泛指具有以下特征的任何文件:
- 純文本,使用某個字符集,比如ASCII、Unicode、EBCDIC或GB2312;
- 由記錄組成(典型的是每行一條記錄);
- 每條記錄被分隔符分隔為字段(典型分隔符有逗號、分號或制表符;有時分隔符可以包括可選的空格);
- 每條記錄都有同樣的字段序列。
Python讀取CSV文件的三種方式:
普通方法讀取:
with open("fileName.csv") as file: for line in file: print line
用CSV標准庫讀取:
import csv csv_reader = csv.reader(open("fileName.csv")) for row in csv_reader: print row
用pandas讀取:
import pandas as pd data = pd.read_csv("fileName.csv") print data data = pd.read_table("fileName.csv",sep=",") print data
CSV文件存儲
前言
CSV,全稱為Comma-Separated Values,中文名可以叫做字符分隔值或逗號分隔值,以純文本形式存儲表格數據,文本默認以逗號分隔,CSV相當於一個結構化表的純文本形式,比Excel文件更加簡潔,保存數據非常方便。
單行寫入
import csv with open('demo.csv', 'w', encoding='utf-8') as csvf: writer = csv.writer(csvf) writer.writerow(['id', 'name', 'gender']) writer.writerow(['100', 'makerchen', 'male']) writer.writerow(['101', 'makerliu', 'female']) writer.writerow(['102', 'makerqin', 'male'])
首先調用csv庫的 writer() 方法初始化寫入對象,然后再調用 writerow() 方法傳入每行的數據即可完成寫入。且默認行數據之間以逗號分隔【csv文件一般都是按照行數據寫入】
運行結果:
如果想修改列與列之間的分隔符,可以傳入參數 delimiter ,代碼如下:
import csv with open('demo.csv', 'w', encoding='utf-8') as csvf: writer = csv.writer(csvf, delimiter=' ') writer.writerow(['id', 'name', 'gender']) writer.writerow(['100', 'makerchen', 'male']) writer.writerow(['101', 'makerliu', 'female']) writer.writerow(['102', 'makerqin', 'male'])
這里表示每一列數據以空格分隔。
運行結果:
多行寫入
調用 writerows() 方法就可以同時寫入多行,此時參數需要為二維列表。代碼如下:
import csv with open('demo.csv', 'w', encoding='utf-8') as csvf: writer = csv.writer(csvf) writer.writerow(['id', 'name', 'gender']) writer.writerows([['100', 'makerchen', 'male'], # 傳參為可迭代的數據類型 ['101', 'makerliu', 'female'], ['102', 'makerqin', 'male']])
運行結果:
字典寫入
一般情況下,爬蟲提取的數據都是結構化數據,我們一般會用字典來表示,代碼如下:
import csv with open('demo.csv','w',encoding='utf-8') as csvf: fieldnames = ['id','name','gender'] writer = csv.DictWriter(csvf,fieldnames=fieldnames) writer.writeheader() writer.writerow({'id':'100','name':'makerchen','gender':'male'}) writer.writerow({'id':'101','name':'makerliu','gender':'female'}) writer.writerow({'id':'102','name':'makerqin','gender':'male'})
運行結果:
首先用 fieldnames 定義頭信息,然后將其傳給 DictWriter 來初始化一個字典寫入對象,接着用 writeheader() 方法寫入頭信息,最后調用 writerow() 方法傳入字典即可。
如果想追加寫入的話,可將 open() 方法的第二個參數改為a,代碼如下:
with open('demo.csv','a',encoding='utf-8') as csvf
讀取CSV文件
將剛才寫入的文件內容讀取出來,代碼如下:
import csv with open('demo.csv','r',encoding='utf-8') as csvf: datas = csv.reader(csvf) for data in datas: print(data)
運行結果:
通過遍歷輸出每行內容,每一行都是一個列表形式。
【注意】如果CSV文件中包含中文的話,還需要指定文件編碼。
當然也可以用pandas庫中的 read_csv() 方法將數據從CSV中讀取出來:
import pandas as pd data = pd.read_csv('demo.csv') print(data)
此種方式在做數據分析的時候用的比較多,也是一種比較方便讀取CVS文件的方法。