Python系列教程(三十五):csv和ini文件操作

  一、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

csv文件

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)

Jimmy's Blog ,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.xjimmy.com/python-35-csv_ini.html

Leave a Comment