您好,登錄后才能下訂單哦!
?
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記錄;
字段可以使用雙引號括起來,也可以不使用;如果字段中出現了雙引號、逗號、換行符,必須用雙引號括起來;如果字段的值是雙引號,使用兩個雙引號表示一個轉義(通常一個特殊字符重復兩次,表示其本身);
表頭可選,和字段列對齊就行;
?
?
?
?
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'
?
?
?
?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。