一、csv文件
1、什么是csv文件
csv本质上是一个文本文件,只是一个有固定格式,比较规范的文本文件而已,是一个被行分隔符、列分隔符分成行和列的文本文件,也是由一行行和一列列的数据组成,每一行称为一条record记录,每一列称为一个字段,而且csv文件不指定字符编码。
csv的格式很像Excel表格一样,所以在windows中是可以用excel打开编辑的。
2、csv文件格式
每一行由换行符‘\r\n’分割,每一列由列分隔符 ‘逗号或者制表符’分割。
字段的数据可以使用双引号括起来,也可以不使用,但是如果字段的数据本身就包含了双引号、逗号、换行符等特殊字符串,必须使用双引号括起来。如果字段的值也有双引号,那么需要使用两个双引号表示转义。
3、手动创建一个csv文件
#注意如果字段的值也有双引号,应该使用两个双引号表示转义 >>> date = ''' ... id,name,age,key ... 1,zhangsan,29,10dg3 ... 2,lisi,33 ... 3,laowang,30,"this is a ""feiji"" string" ... ''' >>> with open(r'C:\Users\Jimmy\Desktop\test.csv','w') as f: ... f.write(date) ... 89
4、csv模块
读取csv文件:reader(iterable, dialect='excel',**fmtparams) -> Iterator
① iterable:接收一个可迭代对象,注意,不是文件地址,可以传一个文件对象
② 返回的Iterator的每一个元素都是一个列表,每一个列表都是一行数据根据列分隔符分割好的字段组成。
③ fmtparams:可以指定读取格式,有如下参数可选:
delimiter:列分隔符,默认是‘,’逗号
lineterminator:行分隔符,默认是‘\r\n’
quotechar:字段的引用符号,默认是双引号‘"’
doublequote:默认为True,表示如果字段的值也出现quotechar符号,则使用两个quotechar符号表示转义,False表示使用转义字符来进行转义。
escapehcar:转义字符
#可以看到,把路径当中字符串来进行迭代处理了 >>> csv_file = csv.reader(r'C:\Users\Jimmy\Desktop\test.csv') >>> next(csv_file) ['C'] >>> next(csv_file) [':'] >>> next(csv_file) ['\\'] #正确的使用方法,传递一个文件对象给第一个参数 #第一行是表头数据,为空,所以是一个空列表 >>> csv_file = csv.reader(open(r'C:\Users\Jimmy\Desktop\test.csv')) >>> next(csv_file) [] >>> next(csv_file) ['id', 'name', 'age', 'key'] >>> next(csv_file) ['1', 'zhangsan', '29', '10dg3'] >>> next(csv_file) ['2', 'lisi', '33'] >>> next(csv_file) ['3', 'laowang', '30', 'this is a "feiji" string'] #指定列分隔符delimiter='e' >>> csv_file = csv.reader(open(r'C:\Users\Jimmy\Desktop\test.csv'),delimiter='e') >>> next(csv_file) [] >>> next(csv_file) ['id,nam', ',ag', ',k', 'y'] >>> next(csv_file) ['1,zhangsan,29,10dg3'] >>> next(csv_file) ['2,lisi,33'] >>> next(csv_file) ['3,laowang,30,"this is a ""f', 'iji"" string"']
写入csv文件:writer(iterable, dialect='excel',**fmtparams) -> Write对象
① 参数跟reader()一样
② 返回的是一个write对象,可以调用writerow(iterable)和writerows(iterable)写入
>>> rows = [ [4,'jimmy',28,'good'],[5,'tom',99],[6,'jerry']] >>> row = rows[0] >>> with open(r'C:\Users\Jimmy\Desktop\test.csv','a') as f: ... write = csv.writer(f) ... write.writerow(row) ... write.writerows(rows)
二、ini文件
1、什么是ini文件
ini文件本质上也是一个文本文件,只是一个有固定格式的文本文件而已,一般用来作为配置文件使用。
# For advice on how to change settings please see [DEFAULT] keepalive = 10 [mysql] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock [mysqld] # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid explicit_defaults_for_timestamp=true
2、ini文件格式
ini文件一般使用‘[section_name]’分为好几段,每一个[section]都有属于它的key=value键值对,这些kv对就是ini文件的配置选项和对应值。
注意:这里的默认section:[DEFAULT]必须大写
3、configparser模块的ConfigParser类
我们引用configparser模块的ConfigParser类来操作ini文件,可以更快速更方便的我们处理。
方法1:read(ini_file,encoding=None) ->List
说明:首先通过ConfigParser类实例化一个对象,由对象去读取ini文件,可以指定编码格式,返回ini文件路径的列表
>>> from configparser import ConfigParser >>> ini = ConfigParser() >>> ini.read(r'C:\Users\Jimmy\Desktop\my.cnf') ['C:\\Users\\Jimmy\\Desktop\\my.cnf']
方法2:sections() -> List
说明:返回所有段名组成的列表,不包括DEFAULT段
>>> ini.sections() ['mysql', 'mysqld']
方法3:add_section(section_name) ->None
说明:增加一个section段
>>> ini.add_section('zabbix')
方法4:has_section(section_name) ->Bool
说明:判断是否有section_name这个段
>>> ini.has_section('zabbix') True
方法5:options(section) -> List
说明:返回指定section段的所有option组成的列表
>>> ini.options('mysqld') ['symbolic-links', 'log-error', 'pid-file', 'explicit_defaults_for_timestamp', 'keepalive']
方法6:has_option(section,option) ->Bool
说明:判断section这个段是否有option这个选项
>>> ini.has_option('mysql','datadir') True >>> ini.has_option('mysql','datadir1') False
方法7:get(section, option, *, raw=False, vars=None, fallback=_UNSET) -> Value
说明:从指定section段的option中取对应的值
① 如果在section中无法获取值,就去DEFAULT中查看
② 还有3个可以指定返回数据类型的方法,使用方法和get一样:getint(),getfloat(),getboolean()
>>> ini.get('mysql','datadir') '/var/lib/mysql' #mysql段没有keepalive,但是DEFAULT有 >>> ini.getint('mysql','keepalive') 10
方法8:items([section],raw=False,vars=None) ->List
说明:
① 不管指不指定section,都会包含DEFAULT段
② 如果指定了section,则返回指定section段下的所有kv对组成的一个二元组的一个列表
③ 如果没有指定section,则返回一个所有section和对象组成的一个二元组的迭代器
#指定section >>> ini.items('mysql') [('keepalive', '10'), ('datadir', '/var/lib/mysql'), ('socket', '/var/lib/mysql/mysql.sock')] #未指定section >>> list(ini.items()) [('DEFAULT', <Section: DEFAULT>), ('mysql', <Section: mysql>), ('mysqld', <Section: mysqld>), ('zabbix', <Section: zabbix>)]
方法9:set(section,option,value) -> None
说明:在section中添加option=value
① option和value必须都是字符串
#添加前 >>> ini.has_option('mysql','key') False >>> ini.set('mysql','key','jimmy') #添加后 >>> ini.has_option('mysql','key') True
方法10:remove_section(section) ->None
说明:移除section及其下属的所有option
#移除前 >>> ini.has_section('mysqld') True >>> ini.remove_section('mysqld') True #移除后 >>> ini.has_section('mysqld') False
方法11:remove_option(section,option) -None
说明:移除section段下指定的option键值对
#移除前 >>> ini.has_option('mysql','key') True >>> ini.remove_option('mysql','key') True #移除后 >>> ini.has_option('mysql','key') False
方法12:write(fileobj, space_around_delimiters=True) -> None
说明:
① write跟read第一个传递的参数不一样,这里需要一个文件对象
② 一般使用open函数使用w模式打开一个文件
③ wirte函数并不会自动帮你关闭文件,需要自己释放,所以一般write也是放在with语句中。
with open(r'C:\Users\Jimmy\Desktop\my.cnf','w') as f: ini.write(f)