18 - csv文件-ini文件處理

1 CSV文件

        逗號分隔值(Comma-Separated Values,CSV,有時也稱爲字符分隔值,由於分隔字符也能夠不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。mysql

# 下面都是csv文件的內容格式
1,2,3,4,5

1,2,"1,3"

1,2,"a,""f"
  • CSV 是一個被行分隔符、列分隔符劃分紅行和列的文本文件。
  • CSV 不指定字符編碼。

它有如下規範:sql

  1. 行分隔符爲\r\n,最後一行能夠沒有換行符
  2. 列分隔符常爲逗號或者製表符。每一行稱爲一條記錄record
  3. 字段可使用雙引號括起來,也能夠不使用。若是字段中出現了雙引號、逗號、換行符必須使用雙引號括起來。
  4. 若是字段的值是雙引號,須要額外使用一個個雙引號,表示一個轉義。
  5. 表頭可選,和字段列對齊就好了。

1.1 手動生成一個csv文件

只須要打開一個文件,按照CSV的格式,編寫內容,而後寫入文件中去便可。json

from pathlib import Path

p = Path(r'E:\Python - base - code\chapter06文件\test.csv')
p.touch()
csv_body = '''\
no,name,age,comment
1,daxin,20,"I Like Cat"
2,tom,30,"I Like Movice"
3,ben,40,"I""m super man    # "" 表示"
4xyz"
'''

with open(p,'a+') as f:
    f.write(csv_body)

1.2 cvs模塊

Python提供的csv模塊用於處理csv文件,主要經過讀(reader)寫(writer)兩種方式:socket

1.2.1 reader方法

csv模塊的reader方法,用於讀模式打開一個csv文件,返回一個reader對象,是一個行迭代器。它的基本格式爲:函數

csv.reader(iterable, dialect='excel',**fmtparams)
  • dialect:表示使用excel的方言(標準)去讀取
  • **fmtparams: 對excel的規範進行自定義設置

能夠設置的參數有:編碼

  1. delimiter:列分隔符(逗號)
  2. lineterminator:行分隔符\r\n
  3. quotechar:字段的引用符號,缺省爲 " 雙引號
  4. 雙引號的處理(通常使用doublequote=True,按照默認的來)
    • doublequote 雙引號的處理,默認爲True。若是碰到數據中有雙引號,而quotechar也是雙引號,doublequote=True時,則使用2個雙引號表示,False表示使用轉義字符將做爲雙引號的前綴
    • escapechar 一個轉義字符,默認爲None
    • writer = csv.writer(f, doublequote=False, escapechar='@') 遇到雙引號,則必須提供轉義字符
  5. quoting 指定雙引號的規則
    • QUOTE_ALL 全部字段
    • QUOTE_MINIMAL特殊字符字段,Excel方言使用該規則
    • QUOTE_NONNUMERIC非數字字段
    • QUOTE_NONE都不使用引號。

建議都是用默認規則spa

from pathlib import Path
import csv

p = Path(r'E:\Python - base - code\chapter06文件\test.csv')
with open(p, 'r') as f:
    reader = csv.reader(f)
    print(next(reader))  # ['no', 'name', 'age', 'comment']  逗號分隔好的一行列表
    for line in reader:
        print(line)

# ['no', 'name', 'age', 'comment']
# ['1', 'daxin', '20', 'I Like Cat']
# ['2', 'tom', '30', 'I Like Movice']
# ['3', 'ben', '40', 'I"m super man\n4xyz']

1.2.2 writer方法

csv模塊的writer方法,用於寫模式打開一個csv文件,返回一個DictWriter對象。它的基本格式爲:excel

writer(fileobj, dialect='excel', *args, **kwargs):

它包含兩個主要的方法:code

  • writerow(row):寫一行
  • writerows(rows):寫多行

注意,這裏的row須要是一個列表

from pathlib import Path
import csv

p = Path(r'E:\Python - base - code\chapter06文件\test.csv')

rows = [
    ['1', 'daxin', '20', 'I Like Cat'],
    ['2', 'tom', '30', 'I Like Movice'],
    ['3', 'ben', '40', 'I"m super man\n4xyz']
]

with open(p, 'a+') as f:
    writer = csv.writer(f)
    writer.writerow(rows[0])  # 寫一行
    writer.writerows(rows)    # 寫多行

        觀察生成好的csv文件,發現每一行,後面都會多一行空行,這是由於在寫的時候把一行文本的結尾\r\n轉換成兩個回車寫入的,因此官方建議咱們在打開文件的時候,添加newline=''參數,來組織替換。讀取時也可使用newline參數(不會影響原來的讀取效果)

with open(p, 'a+', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(rows[0])  # 寫一行
    writer.writerows(rows)    # 寫多行

2 ini文件處理

做爲配置文件,ini文件格式很流行。著名的配置文件還有:json,yaml,xml等。下面是一個ini格式的文件(mariadb就是用的是這種格式的配置文件)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

其中:

  • 中括號裏面的部分稱爲section,譯做節、區、段。
  • 每個section內,都是key=value造成的鍵值對,key稱爲option選項。

2.1 configparser模塊

        configparser模塊的ConfigParser類就是用來操做ini文件的。能夠將section當作key,section存儲着鍵值對組成的字典,能夠把ini配置文件當作一個嵌套的字典。默認使用的是有序字典。

注意:在Python中的configparser庫中,DEFAULT是缺省section的名字,必須大寫,必須存在。當其餘section中不存在某個option中時,會在DEFAULT中尋找對應的option,若是不存在則提示異常或者調用fallback。

ConfigParser對象中有不少方法,其中與讀取配置文件,判斷配置相關的方法有:

  • read: 讀取一個ini配置文件
  • sections:返回一個包含全部章節的列表
  • has_sections:判斷章節是否存在
  • items:以元祖的形式返回全部的選項
  • options:返回一個包含章節下全部選項的列表
  • has_option:判讀某個選項是否存在
  • getgetbooleangetinitgetfloat:獲取選項的值

ConfigParser對象也提供了許多方法便於咱們修改配置文件:

  • remove_section:刪除一個章節
  • add_section:添加一個章節
  • remote_option:刪除一個選項
  • set:添加一個選項(寫入的全部值,都是字符串)
  • write:將ConfigParser對象中保存的數據保存的文件中去

2.2 經常使用方法

2.2.1 讀取配置配件

        解析一個配置文件,須要先建立一個ConfigParser對象,建立ConfigParser對象時有多個參數,其中比較重要的是allow_no_value,allow_no_value默認取值爲False,表示在配置文件中是否容許有沒有選項的值的狀況。默認狀況下每一個選項都應該有一個值,可是在一些特殊的應用選項下,選項存在即爲真,不存在即爲假,好比MySQL的配置文件skip-external-locking。因此若是須要解析這樣的參數,那麼就須要在實例化的時候添加allow_no_value 爲True

config.read(filenames, encoding=None,allow_no_value=False):

讀取ini文件,能夠是單個文件,也能夠是文件列表。能夠指定文件編碼。

2.2.2 section操做

  • sections() 返回section列表。缺省section不包括在內。
  • add_section(section_name) 增長一個section。
  • has_section(section_name) 判斷section是否存在
  • remove_section(section):移除section及其全部option

2.2.3 option操做

  • options(section) 返回section的全部option,會追加缺省section的option
  • has_option(section, option) 判斷section是否存在這個option
  • items(section, raw=False, vars=None):沒有section,則返回全部section名字及其對象,若是指定section,則返回這個指定的section的鍵值對組成二元組。
  • remove_option(section, option):移除section下的option。

2.2.4 獲取value

  • get(section, option, *, raw=False, vars=None[, fallback]):從指定的段的選項上取值,若是找到返回,若是沒有找到就去找DEFAULT段有沒有,若是尚未,則看fallback是否指定,沒有則直接拋出異常,不然返回fallback。
  • getint(section, option, *, raw=False, vars=None[, fallback]):同get方式,結果會使用int函數轉換
  • getfloat(section, option, *, raw=False, vars=None[, fallback]):同get方式,結果會使用float函數轉換
  • getboolean(section, option, *, raw=False, vars=None[, fallback]):同get方式,結果會使用bool函數轉換

2.2.5 設置value

  • set(section, option, value):section存在的狀況下,寫入option=value,要求option、value必須是字符串。

2.2.6 保存修改後的配置文件

  • write(fileobject, space_around_delimiters=True):將當前config的全部內容寫入fileobject中,通常open函數使用w模式。

2.3 字典的訪問方式

對Configparser對象的操做還可使用字典的方式:

from configparser import ConfigParser
from pathlib import Path

p = Path('mysql.ini')

config = ConfigParser()
config.read(p)

config['daxin'] = {'name':'daxin','age':20}  # 新建一個section
print(config['daxin']['name'])  # daxin

在Configparser內部,其實使用的就是一個OrderDict存儲的

相關文章
相關標籤/搜索