CSV文件存儲

2021-12-24 Python機器學習算法說書人

CSV ,全稱為 Comma-Separated Values ,中文可以叫逗號分隔值或字符分隔值,其文件以純文本形式存儲表格數據。該文件是一個字符序列,可以由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由欄位組成,欄位間的分隔符是其他字符或字符串,最常見的是逗號或制表符。不過所有記錄都有完全相同的欄位序列,相當於一個結構化表的純文本形式。它比 Excel 文件更加簡潔, XLS 文本是電子表格,它包含了文本、數值、公式和格式等內容,而 CSV 中不包含這些內容,就是特定字符分割的純文本,結構簡單清晰。

寫入

這裡先看一個最簡單的例子:

  import csv
with open('data.csv', 'w')as csvfile:
   writer = csv.writer(csvfile)
   writer.writerow(['id', 'name', 'age'])
   writer.writerow(['10001', 'Mike', 20])
   writer.writerow(['10002', 'Bob', 22])
   writer.writerow(['10003', 'Jordan', 21])

首先,打開 data.csv 文件,然後指定打開的模式為 w (即寫入),獲得文件句柄,隨後調用 csv 庫的 writer() 方法初始化寫入對象,傳入該句柄,然後調用 writerow() 方法傳入每行的數據即可完成寫入。

運行結束後,會生成一個 data.csv 的文件,此時數據就成功寫入了,直接以文本形式打開的話,其內容如下:

  id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

我們可以發現每條記錄中間都空了一行,這可不太好啊!那麼如何解決這個問題呢?首先從 open 方法入手,我們先查看一下 open 方法,打開命令提示符輸入 python 或 ipython 回車進交互式解釋器環境。然後直接輸入 help(open) 回車,如圖所示。

首先看這個函數的原型, 1 個必選參數, 7 個默認參數,我們注意到其中一個默認參數是 newline ,引起上面的結果出現空行可能就是因為它了,我們往下滑,找到對 newline 參數的解釋,如圖所示。

稍微翻譯一下, newline 控制全局的換行如何工作(它僅僅應用於文本模式)。它可以是None,『』,『\n』,『\r』 和 『\r\n』。它按照如下方式工作:

在輸入時,如果 newline 是 None ,全局的換行模式是可用的,輸入中的行可以以 『\n』,『\r』 或者 『\r\n』 結尾,並且在被返回給調用者之前,這些會被解釋成 『\n』 。如果它是空字符串,全局換行模式也是可用的,但是每一行的結束符都會原封不動的返回給調用者。如果它有其他任何合法的值,輸入的行僅僅按照被傳入的字符串來終止,並且行的結束符被原封不動的返回給調用者。

在輸出時,如果 newline 是 None ,任何被寫入的 『\n』 字符會被解釋成系統默認的行分隔符, os.linesep 。如果 newline 是 『』 或者 『\n』 ,就沒有解釋發生。如果 newline 是任何其他合法的值,任何被寫入的 『\n』 字符被解釋給傳入的字符串。

簡直是雲裡霧裡啊~!這裡看不懂沒有關係,我們去看一下 csv 的官方文檔(https://docs.python.org/3/library/csv.html#id3),找到如圖所示的位置。

上面是 csv 模塊的 writer 的函數原型,稍微翻譯一下下面一段:

返回一個編寫器對象,負責將用戶的數據轉換為給定類似文件的對象上的分隔字符串。 csvfile 可以是任何擁有寫方法的對象。如果 csvfile 是一個文件對象,它應該伴隨著 newline 參數為空字符串的過程被打開。……為什麼呢?點擊上面的 [1] 跳到最下面的注釋部分,如圖所示。

如果 newline=『』 沒有被規定,嵌入在引號欄位中的換行符將無法正確解釋,並且在使用 \r\n 行尾的平臺上將添加額外的 \r 。由於 csv 模塊遵循它自己的換行處理標準,規定 newline=『』 總歸是安全的。

按照官方文檔所說的內容,我們修改上面的例子。

  import csv
with open('data.csv', 'w', newline='')as csvfile:
   writer = csv.writer(csvfile)
   writer.writerow(['id', 'name', 'age'])
   writer.writerow(['10001', 'Mike', 20])
   writer.writerow(['10002', 'Bob', 22])
   writer.writerow(['10003', 'Jordan', 21])

再次運行一下,然後去看看文件內容,其內容如下:

  id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21

終於成功了!可以看到,寫入的文本默認以逗號分隔,調用一次 writerow() 方法即可寫入一行數據。用 Excel  打開的結果如圖所示。

如果想修改列與列之間的分隔符,可以傳入 delimiter 參數,其代碼如下:

  import csv
with open('data.csv', 'w', newline='')as csvfile:
   writer = csv.writer(csvfile, delimiter=' ')
   writer.writerow(['id', 'name', 'age'])
   writer.writerow(['10001', 'Mike', 20])
   writer.writerow(['10002', 'Bob', 22])
   writer.writerow(['10003', 'Jordan', 21])

在這裡初始化寫入對象時傳入 delimiter 參數為空格,此時輸出結果的每一列就是以空格分隔了,內容如下:

  id name age
10001 Mike 20
10002 Bob 22
10003 Jordan 21

另外,我們也可以調用 writerows() 方法寫入多行,此時參數就需要為二維列表,例如:

  import csv
with open('data.csv', 'w', newline='')as csvfile:
   writer = csv.writer(csvfile)
   writer.writerow(['id', 'name', 'age'])
   writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

輸出效果是相同的,內容如下:

  id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21

但是一般情況下,爬蟲爬取的都是結構化數據,我們一般會用字典來表示。在 csv 庫中也提供了字典的寫入方式,示例如下:

  import csv
with open('data.csv', 'w', newline='')as csvfile:
   fieldnames = ['id', 'name', 'age']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
   writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
   writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})

這裡先定義 3 個欄位,用 fieldnames 表示,然後將其傳給 DictWriter 來初始化一個字典寫入對象,接著可以調用 writeheader() 方法先寫入頭信息,然後再調用 writerow() 方法傳入相應字典即可。最終寫入的結果是完全相同的,內容如下:

  id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21

這樣就可以完成字典到 csv 文件的寫入了。

另外,如果想追加寫入的話,可以修改文件的打開模式,即將 open() 函數的第二個參數改成 a ,代碼如下:

  import csv
with open('data.csv', 'a', newline='')as csvfile:
   fieldnames = ['id', 'name', 'age']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writerow({'id': '10004', 'name': 'Durant', 'age': 22})

這樣在上面的基礎上再執行這段代碼,文件內容便會變成:

  id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21
10004,Durant,22

可見,數據被追加寫到文件中。

如果要寫入中文內容的話,可能會遇到字符編碼的問題,此時需要給 open 參數指定編碼格式。比如,這裡再寫入一行包含中文的數據,代碼需要改寫如下:

  import csv
with open('data.csv', 'a', encoding='utf-8', newline='')as csvfile:
   fieldnames = ['id', 'name', 'age']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writerow({'id': '10005', 'name': '王偉', 'age': 22})

這裡需要給 open() 函數指定編碼,否則可能發生編碼錯誤。

另外,如果接觸過 pandas 等庫的話,可以調用 DataFrame 對象的 to_csv() 方法來將數據寫入 CSV 文件中。

讀取

我們同樣可以使用 csv 庫來讀取 CSV 文件。例如,將剛才寫入的文件內容讀出來,相關代碼如下:

  import csv
with open('data.csv', 'r', encoding='utf-8')as csvfile:
   reader = csv.reader(csvfile)
   for row in reader:
       print(row)

運行結果如下:

  ['id', 'name', 'age']
['10001', 'Mike', '20']
['10002', 'Bob', '22']
['10003', 'Jordan', '21']
['10004', 'Durant', '22']
['10005', '王偉', '22']

這裡我們構造的是 Reader 對象,通過遍歷輸出了每行的內容,每一行都是一個列表形式。注意,如果 CSV 文件包含中文的話,還需要指定文件編碼。

另外,如果接觸過 pandas 的話,可以利用 read_csv() 方法將數據從 CSV 中讀取出來,例如:

  import pandas as pd
df = pd.read_csv('data.csv')
print(df)

運行結果如下:

我們可以發現中文沒有對齊,感覺有點怪怪的~!我們首先需要知道為什麼沒有對齊。它之所以沒有對齊,是因為它以最長的字符串為標準進行右對齊的,同時又因為漢字是寬字符(佔用兩個字符的位置),它現在還是以為中文漢字只有佔一個字符位。如何解決這個問題呢?其實很簡單,設置屬性 display.unicode.ambiguous_as_wide 和 display.unicode.east_asian_width ,將這兩個屬性都設置為 True 即可,代碼如下:

  import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('data.csv')
print(df)

運行結果如下:

在做數據分析的時候,此種方法用的比較多,也是一種比較方便地讀取 CSV 文件的方法。

我們了解了 CSV 文件的寫入和讀取方式。這也是一種常用的數據存儲方式,需要熟練掌握。

今天的文章有不懂的可以加群,群號:822163725,備註:小陳學Python,不備註可是會被拒絕的哦~!

最後歡迎大家掃碼關注

相關焦點

  • CSV是什麼文件 怎麼打開csv文件
    經常使用資料庫軟體的朋友都清楚csv文件是什麼用的,最早是使用在簡單的資料庫裡,由於其格式簡單,並具備很強的開放性,如果使用到csv文件該怎麼打開呢?下面給大家介紹幾種打開csv文件的常用方法。最早出現csv文件是為了實現簡單的數據存儲,是一個純文本的文件,最廣泛的應用是在程序之間轉移表格數據,能夠兼容各類程序,那面對這樣的文件類型該怎麼打開呢,下面一起來學習下csv文件怎麼打開的方法。以下是csv文件怎麼打開的詳細教程:了解什麼是csv文件?
  • 獨家 | 別用csv存儲了-這種文件格式比csv快150倍(附連結)
    csv並不是唯一的數據存儲格式,甚至可能是你最後才考慮使用的格式。如果你不打算手動編輯數據,使用csv是在浪費時間和金錢。想像一下——你收集了大量的數據並將它們存儲在雲端。你沒有對文件格式做太多的研究,所以選擇了csv。你的開銷會爆炸!如果不追求更多,一個簡單的調整可以減少一半開銷。這個調整就是——你已經猜到了——選擇一種不同的文件格式。
  • Python中csv文件的讀寫-csv模塊-了解
    # 逗號分隔值(Comma-Separated Values,CSV,有時也稱為字符分隔值,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據
  • Pandas - 操作CSV 文件
    CSV(Comma-Separated Values,逗號分隔值,有時也稱為字符分隔值,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據
  • python爬蟲數據數據存儲csv模式
    Python 爬蟲的數據存儲模式有很多中,有json,mongodb,mysaql,csv,我本人了解這幾個比較常用的。我們從最容易了解的csv開始。CSV(comma-separated values,逗號分隔值)是存儲表格數據的常用文件格式。Microsoft Excel 和很多應用都支持 CSV 格式,因為它很簡潔。
  • Python對CSV文件的處理
    在接口自動化測試中,把測試的數據存儲到csv的文件也是一種很不錯的選擇,下面就詳細的介紹如何實現CSV文件內容的讀取和如何把數據寫入到
  • python 處理 csv 文件
    csv 文件是一種逗號分隔的純文本形式存儲的表格數據,Python內置了CSV模塊,可直接通過該模塊實現csv文件的讀寫操作,在web應用中導出數據是比較常見操作
  • Python 處理 csv 文件
    csv 文件是一種逗號分隔的純文本形式存儲的表格數據,Python內置了CSV模塊,可直接通過該模塊實現csv文件的讀寫操作,在web應用中導出數據是比較常見操作。這篇文章介紹csv模塊的基本用法寫操作writer.writerow, 將多列數據寫入一行import csvwith open('some.csv', 'w', newline='') as f:     writer = csv.writer(f)    writer.writerow(["123", "234", "
  • 用 Python 將數據寫到 CSV 文件
    我們從網上爬取數據,最後一步會考慮如何存儲數據。如果數據量不大,往往不會選擇存儲到資料庫,而是選擇存儲到文件中,例如文本文件、CSV 文件、xls 文件等。因為文件具備攜帶方便、查閱直觀。Python 作為膠水語言,搞定這些當然不在話下。但在寫數據過程中,經常因數據源中帶有中文漢字而報錯。最讓人頭皮發麻的編碼問題。我先說下編碼相關的知識。
  • Python文件操作經典案例:CSV文件的讀與寫
    ()讀取文件內容。見案例:# 從 csv 文件讀取數據import csvwith open(r"員工薪水錶.csv") as a:a_csv = csv.reader(a) #創建 csv 對象,它是一個包含所有數據的列表,每一行為一個元素
  • 【數據分析入門】帶你分析csv文件格式
    csv模塊包含在Python標準庫中,可用於分析CSV文件中的數據行,讓我們能夠快速提取感興趣的值。下面先來看這個文件的第一行,其中包含一系列有關數據的描述。print(header_row)首先我們導入csv模塊,接著我們打開這個文件,調用csv.reader(),並將前面存儲的文件對象作為實參傳遞給它,從而創建一個與該文件相關聯的閱讀器對象。
  • Python讀取csv文件常見的兩種方法
    #昨天粘貼代碼出現錯誤,這裡重新更正,歡迎大家批評指正。
  • CSV文件在Python中的幾種處理方式
    在資料庫或電子表格中,它是最常見的導入導出格式,它以一種簡單而明了的方式存儲和共享數據,CSV文件通常以純文本的方式存儲數據表。今天,我將給大家分享在Python中如何操作CSV文件。outputfile.csv輸入輸出csv文件名稱以及腳本名稱請自定義,以上只是舉例說明。
  • 巧用Python : 從CSV文件讀取數據
    導出後列表格式的信息被存儲進了對應的CSV文件中。結構打開csv文件,將文件對象命名為f:with open('media2021.csv') as f:調用csv的reader方法將f對象的數據封裝成可迭代的reader對象(這個reader是自定義的變量名稱,可以是其他):with open('media2021.csv') as f:    reader = csv.reader
  • python:數據導入導出之csv文件
    小周梔也是第一次接觸csv文件,那麼就先簡單介紹一下什麼是csv文件吧按照維基百科的解釋1、CSV    全稱 Comma-Separated
  • python學習筆記 - 讀寫CSV文件
    那麼CSV文件中的數據都是以什麼樣的方式存儲的呢:CSV文件以純文本的形式去存儲表格數據。CSV文件由任意數目的記錄組成,通常,所有記錄都有完全相同的欄位序列。記錄之間以某種換行符分隔,如:』\n』。CSV中的每條記錄由多個欄位組成,每個欄位之間以某種分隔符分隔,常見如:, 、| 、制表符。
  • 基礎知識 | 使用 Python 將數據寫到 CSV 文件
    我們從網上爬取數據,最後一步會考慮如何存儲數據。如果數據量不大,往往不會選擇存儲到資料庫,而是選擇存儲到文件中,例如文本文件、CSV 文件、xls 文件等。因為文件具備攜帶方便、查閱直觀。Python 作為膠水語言,搞定這些當然不在話下。但在寫數據過程中,經常因數據源中帶有中文漢字而報錯。最讓人頭皮發麻的編碼問題。我先說下編碼相關的知識。
  • 將爬取到到數據以CSV格式存儲
    CSV文件存儲CSV,全稱為Comma-Separated Values,中文可以叫做逗號分隔值或字符分隔值,其文件以純文本形式存儲表格數據。該文件是一個字符序列,可以由任意數目的記錄組成,記錄間以某種換行符分隔。
  • NumPy——數據CSV文件存取和多維數據的存取
    CSV (Comma‐Separated Value, 逗號分隔值) CSV是一種常見的文件格式,用來存儲批量數據2. np.savetxtnp.savetxt(frame, array, fmt='%.18e', delimiter=None)frame: 文件、字符串或產生器
  • Python3 使用csv模塊處理CSV(逗號分割的值)格式存儲的天氣數據
    ),其文件以純文本形式存儲表格數據(數字和文本).datetime模塊因為csv格式文件中含有日期格式, 我們使用datetime模塊來解析.模塊處理文件代碼中使用到csv文件, 本文末尾有下載連結分析sitkaweather07-2014.csv文件highs_lows.pyimport csvfrom datetime import datetimefrom matplotlib import pyplot as plt# 從文件中獲取每天的最高溫度