CSV文件解析


一、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文件的方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM