目录python
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,由于分隔字符也能够不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。mysql
# 下面都是csv文件的内容格式 1,2,3,4,5 1,2,"1,3" 1,2,"a,""f"
它有如下规范:sql
只须要打开一个文件,按照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)
Python提供的csv模块用于处理csv文件,主要经过读(reader)
和写(writer)
两种方式:socket
csv模块的reader方法,用于读模式打开一个csv文件,返回一个reader对象
,是一个行迭代器
。它的基本格式为:函数
csv.reader(iterable, dialect='excel',**fmtparams)
dialect
:表示使用excel的方言(标准)去读取**fmtparams
: 对excel的规范进行自定义设置能够设置的参数有:编码
通常使用doublequote=True
,按照默认的来)
QUOTE_MINIMAL
特殊字符字段,Excel方言使用该规则建议都是用默认规则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']
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) # 写多行
做为配置文件,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
,译做节、区、段。key
称为option
选项。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
:判读某个选项是否存在get
、getboolean
、getinit
、getfloat
:获取选项的值ConfigParser对象也提供了许多方法便于咱们修改配置文件:
remove_section
:删除一个章节add_section
:添加一个章节remote_option
:删除一个选项set
:添加一个选项(写入的全部值,都是字符串)write
:将ConfigParser对象中保存的数据保存的文件中去 解析一个配置文件,须要先建立一个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文件,能够是单个文件,也能够是文件列表。能够指定文件编码。
对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存储的