日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python中CSV文件的讀寫庫操作方法_python

作者:凍羊的小屋 ? 更新時間: 2022-12-31 編程語言

CSV 格式的全稱是 Comma Separated Values,意思是逗號分割的數據,是最常見的電子表格和數據庫的導出格式之一,在?RFC 4180?中已經成為了一種標準格式。Python 中提供了一個官方的標準庫來處理這種文件類型,那就是 CSV 庫。

官方文檔在此:CSV

文件的基本讀寫

文件的讀寫主要使用?csv.reader?和?csv.writer?來完成,它的定義如下:

csv.reader(csvfile, dialect='excel', **fmtparams)
  • csvfile:返回字符串的迭代器,一般是?open?函數返回的文件對象
  • dialect:用來讀取非標準 csv 格式的指定參數,這部分參考下文
  • **fmtparams:用來指定格式的參數,這部分的詳細參數參考下文

最簡單、最常用的使用方法是將?open?函數返回的文件對象直接丟給?csv.reader?就會得到一個每次返回一個拆分后的字符串列表的迭代器:

import csv
with open('file.csv', 'r') as input_file:
    file_content = csv.reader(input_file, delemiter=',')
    for row in file_content:
        # code here
        pass

類似地,對文件的寫操作與原生方法類似:

import csv
with open('file.csv', 'w', newline='') as output_file:
    file_writer = csv.writer(output_file, delimiter=',')
    file_writer.writerow(['Spam'] * 5 + ['Baked Beans'])
    file_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

用字典模式處理數據

有時候,我們可能需要將數據讀取成字典(例如要上傳到 MongoDB 的時候),這時候我們可以使用?csv.DictReader?將表格形式的數據讀取為字典形式的數據

這個函數的參數如下:

csv.DictReader(
    f,
    fieldnames=None,
    restkey=None, restval=None,
    dialect='excel',
    *args, **kwds
)
  • f:可迭代對象或者文件對象
  • fieldnames:一個有序列表,代表字典中的字段(一般是文件的列名),如果不指定,就用文件的第一行的字符串來作為字段的名字
  • restkey:如果列名的數量少于內容的列數,那么剩下的列就會被統一放到一個字段里,這里的?restkey?就是這個字段的名字,默認為?None
  • restval:與?restkey?類似,如果內容的列數少于列名的數量,那么內容中缺少的列就會被填充,這個參數指定用來填充的值,默認為?None
  • 其他的參數與?csv.reader?相同

一個簡單的示例如下:

import csv
with open('file.csv') as input_file:
    reader = csv.DictReader(input_file)
    for row in reader:
        print(row['first_name'], row['last_name'])

# Eric Idle
# John Cleese

print(row)
# {'first_name': 'John', 'last_name': 'Cleese'}

類似地,字典的寫通過?csv.DictWriter?來完成,這個函數將字典類型的數據輸出為表格形式的數據csv.DictWriter?的參數如下:

csv.DictWriter(
    f,
    fieldnames,
    restval='', extrasaction='raise',
    dialect='excel',
    *args, **kwds
)

與?csv.DictWriter?類似,fieldnames?指定所有的字段名稱,restval?用來指定當指定字段有缺失值的時候用來填充的內容,extrasaction?參數用來指定內容缺少字段時的操作,默認會?'raise',即引發一個?ValueError?異常,可以設置為?'ignore',對應著忽略額外值,一個示例如下:

import csv

with open('names.csv', 'w', newline='') as output_file:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(output_file, fieldnames=fieldnames)
    # 將
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

非標準格式的處理

有時候,csv 的文件可能不是標準的 csv 文件,無法直接讀取,這時候我們需要指定一些額外參數來處理這些情況,這種情況下需要用到?dialect?功能,這個功能包含若干類和若干函數來幫助我們實現我們的目的。

dialect

默認情況下,三個 dialect 類型是內置的,分別是?'unix''excel'、和?'excel_tab''unix'?模式用來處理在 Unix 系統下生成的文件,而?'excel'?模式用來處理 excel 生成的 csv 文件,最后的?'excel_tab'?用來處理 excel 生成的制表符分割的文件,這三種預設已經覆蓋了絕大多數的使用場景。

用戶可以使用 Dialect 類來自定格式的處理:

csv.register_dialect(
    'unixpwd',
    delimiter=',',
    quoting=csv.QUOTE_MINIMAL,
    quotechar='"',
    doublequote=True,
    escapechar=None,
    lineterminator='\r\n',
    skipinitialspace=False,
    strict=False
)
  • name:自定義的格式名稱
  • delimiter:用來分割各字段的字符,默認為?,
  • doublequote:沒啥用,看不懂,待補充
  • escapechar:沒啥用,一般不用
  • lineterminator:換行符,默認是?'\r\n'
  • quotechar:當字段含有特殊字符是,用來引用的符號,默認是?",不用改,不常用
  • quoting:加引號的行為,可以選擇?QUOTE_ALLQUOTE_MINIMALQUOTE_NONNUMERICQUOTE_NONE?四種行為
  • skipinitialspace:是否跳過分隔符后面的空格,默認為?False
  • strict:嚴格模式,如果為 True,文件格式不對的時候會報錯終止,否則會強制讀取

使用方法就是先使用csv.register_dialect注冊一個自定義dialect,然后在reader里面指定它:

import csv
csv.register_dialect(
    'unixpwd',
    delimiter=':',
    quoting=csv.QUOTE_NONE,
    ...
)
with open('passwd', newline='') as f:
    reader = csv.reader(f, 'unixpwd')

Sniffer

正如它的名字,sniffer?提供了對格式的自動檢測,并輸出一個?dialect,提供了兩個函數,分別是?has_header,用來檢測文件是否包含標題行,和主函數?sniff,這里通過一個例子來學習它的使用:

with open('example.csv', newline='') as csvfile:
    # 通過文件的前1024行來確定文件的格式規范
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    # 將指針重置,從文件開始進行讀取
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ..

原文鏈接:https://www.cnblogs.com/wdyyy/p/python_csv.html

欄目分類
最近更新