20文件IO_csv_ini
admin
2023-07-09 06:24:20
0次

 

csv、ini

 

csv:

配置信息,ini、xml、json(可映射为dict);

 

结构化:DB,用schema来描述数据是干什么的,人可理解;

半结构化:json,html,xml,人可理解;

非结构化:video,image等二进制数据,机器理解;

 

结构化和半结构化数据,人可理解;

非结构化数据,机器理解;

 

comma separated values,逗号分隔值;

csv是一个被行分隔符、列分隔符划分成行和列的文本文件;

没有指定的字符编码,参考RFC 4180 http://www.ietf.org/rfc/rfc4180.txt;

行分隔符为\r\n,最后一行可以没有换行符;

列分隔符常为逗号或制表符;

每一行称为一条record记录;

字段可以使用双引号括起来,也可以不使用;如果字段中出现了双引号、逗号、换行符,必须用双引号括起来;如果字段的值是双引号,使用两个双引号表示一个转义(通常一个特殊字符重复两次,表示其本身);

表头可选,和字段列对齐就行;

 

20文件IO_csv_ini

 

 

 

csv模块:

csv.reader(csvfile,dialect='excel',**fmtparams),

**fmtparams,解字典;

返回DictReader的实例,是个行迭代器;

delimiter,列分隔符,逗号,也可用:冒号;

lineterminator,行分隔符\r\n;

quotechar,字段的引用符号,缺省为"双引号,如果使用其它符号,如^,则内容中有双引号则不用处理;

 

双引号的处理:

doublequote,默认为True,如果和quotechar为同一个,True则使用2个双引号表示,False表示使用转义字符将作为双引号的前缀;

excapechar,一个转义符,默认为None;

quoting,指定双引号的规则,QUOTE_ALL所有字段;QUOTE_MINIMAL默认,特殊字符字段,不冲突不加双引号,冲突加双引号;QUOTE_NONNUMERIC,非数字字段;QUOTE_NONE,都不使用双引号;

 

csv.writer(csvfile,dialect='excel',**fmtparams),返回DictWriter的实例,主要方法有csv.write(f).writerow(),csv.write(f).writerows();

 

 

 

例:

s = '''

1,tom,20,

2,jerry,16,

3,,,

'''

 

with open('test.csv','w') as f:

    for line in s.splitlines():

        f.write(line + '\n')

 

In [31]: cat test.csv

 

1,tom,20,

2,jerry,16,

3,,,

 

注:

结果中第一行为空白,解决办法:

1)

s = '''1,tom,20,

2,jerry,16,

3,,,

'''

2)

s = '''\   #通常用此种

1,tom,20,

2,jerry,16,

3,,,

'''

 

例:

from pathlib import Path

 

p = Path('/home/python/magedu/projects/cmdb/test1/test.csv')

 

parent = p.parent

#print(parent)

 

if not parent.exists():

    parent.mkdir(parents=True)

 

csv_body = '''\

1,tom,20,

2,jerry,16,

3,jowin,18,

'''

 

p.write_text(csv_body)

 

In [34]: cat test1/test.csv

1,tom,20,

2,jerry,16,

3,jowin,18,

 

例:

from pathlib import Path

import csv

 

path = '/home/python/magedu/projects/cmdb/test.csv'

p = Path(path)

 

if not p.parent.exists():

    p.parent.mkdir(parents=True)

 

line1 = [1,'tom',20,'']

line2 = [2,'jerry',18,'']

line3 = [line1,line2]

 

with open(path,'w') as f:

    writer = csv.writer(f)

    writer.writerow(line1)

    writer.writerow(line2)

    writer.writerows(line3)

 

with open(path) as f:

    reader = csv.reader(f)

    for line in reader:

        if line:

            print(line)

 

 

 

ini文件:

作为配置文件,ini文件格式很流行;

 

例:

]$ egrep -v '^#|^$|[[:space:]]' my.cnf

[client]

[mysqld]

skip-external-locking

log-bin=mysql-bin

binlog_format=mixed

[mysqldump]

quick

[mysql]

no-auto-rehash

[myisamchk]

[mysqlhotcopy]

interactive-timeout

 

中括号部分称为section,每一个section内,都是key=value形式的kv对,key称为option选项;

字典套字典,配置文件应独立出来,而不是放在代码中;

 

configparser模块的ConfigParser类:

from configparser import ConfigParser

cfg=ConfigParser()

cfg.read(filenames,encoding=None),读取ini文件,可以是单个文件(一般仅读一个文件),也可以是文件列表,可指定文件编码;

 

cfg.sections(),返回section列表,缺省section不在内;

 

cfg.add_section(section_name),增加一个section;

 

cfg.has_section(section_name),判断section是否存在;

 

cfg.options(section),返回section的所有option;

 

cfg.has_option(section,option),判断section是否存在这个option;

 

cfg.get(section,option,*,raw=False,vars=None[,fallback]),从指定的段的选项上取值,如果找到返回,如果没有找到去找DEFAULT段有没有;

 

cfg.getint(section,option,raw=False,vars=None[,fallback])

cfg.getfloat(section,option,raw=False,vars=None[,fallback])

cfg.getboolean(section,option,raw=False,vars=None[,fallback])

同cfg.get()

 

cfg.items(raw=False,vars=None),一般不用,没有section,则返回所有section名字及其对象;

 

cfg.items(section,raw=False,vars=None),section存在的情况下,写入option=value,要求option、value必须是字符串;

 

cfg.remove_section(section),移除section及其所有option;

 

cfg.remove_option(section,option),移除section下的option;

 

cfg.write(fileobject,space_around_delimiters=True),等号前后有无空格,取默认即可;

 

 

 

例:

]$ vim my.cnf

[DEFAULT]

a=test

[mysql]

default-character-set=utf8

[mysqld]

log-bin=mysql-bin

binlog_format=mixed

datadir=/mydata/data

port=3306

character-set-server=utf8

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

In [1]: from configparser import ConfigParser

In [2]: cfg=ConfigParser()

In [3]: cfg.read('my.cnf')

Out[3]: ['my.cnf']

In [4]: cfg.sections()

Out[4]: ['mysql', 'mysqld']

In [5]: cfg.add_section('newsection')

In [6]: cfg.sections()

Out[6]: ['mysql', 'mysqld', 'newsection']

In [9]: cfg.options('mysql')

Out[9]: ['default-character-set', 'a']

In [10]: cfg.options('mysqld')

Out[10]:

['log-bin',

 'binlog_format',

 'datadir',

 'port',

 'character-set-server',

 'sql_mode',

 'a']

In [11]: for section in cfg.sections():

    ...:     for option in cfg.options(section):

    ...:         print(section,option)

    ...:        

mysql default-character-set

mysql a

mysqld log-bin

mysqld binlog_format

mysqld datadir

mysqld port

mysqld character-set-server

mysqld sql_mode

mysqld a

newsection a

In [12]: cfg.items('mysqld')

Out[12]:

[('a', 'test'),

 ('log-bin', 'mysql-bin'),

 ('binlog_format', 'mixed'),

 ('datadir', '/mydata/data'),

 ('port', '3306'),

 ('character-set-server', 'utf8'),

 ('sql_mode', 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES')]

In [13]: for section in cfg.sections():

    ...:     for k,v in cfg.items(section):

    ...:         print(section,k,v)

    ...:        

mysql a test

mysql default-character-set utf8

mysqld a test

mysqld log-bin mysql-bin

mysqld binlog_format mixed

mysqld datadir /mydata/data

mysqld port 3306

mysqld character-set-server utf8

mysqld sql_mode NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

newsection a test

In [14]: cfg.has_section('newsection')

Out[14]: True

In [15]: if not cfg.has_section('test'):

    ...:     cfg.add_section('test')

    ...:    

In [16]: cfg.sections()

Out[16]: ['mysql', 'mysqld', 'newsection', 'test']

In [17]: cfg.set('test','test1','123')   #往指定section里添加option=value,'123'是字符,configparser要求的

In [18]: cfg.set('test','test2','abc')

In [19]: cfg.options('test')

Out[19]: ['test1', 'test2', 'a']

In [27]: with open('my.cnf','w') as f:

    ...:     cfg.write(f)   #ini文件更多的是读取,读完后常驻内存,而不是写

    ...:    

In [28]: example=cfg.get('test','test1')

In [29]: type(example)

Out[29]: str

In [30]: example

Out[30]: '123'

In [31]: example1=cfg.getint('test','test1')   #隐藏有强制类型转换,读出后是int类型可直接用于计算

In [32]: example1

Out[32]: 123

In [33]: type(example1)

Out[33]: int

In [34]: example2=cfg.get('test','a')   #找默认段的不是强制的

In [35]: type(example2)

Out[35]: str

In [36]: example2

Out[36]: 'test'

 

 

 

 


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...