csv文件和ini文件操作

csv文件
  • csv文件简介

    • 参看 RFC 4180
      http://www.ietf.org/rfc/rfc4180.txt
    • 逗号分隔值Comma-Separated Values。
      CSV 是一个被行分隔符、列分隔符划分成行和列的文本文件,CSV 不指定字符编码
    • 行分隔符为\r\n,最后一行可以没有换行符列分隔符常为逗号或者制表符。每一行称为一条记录record
    • 字段可以使用双引号括起来,也可以不使用。如果字段中出现了双引号、逗号、换行符必须使用双引号括起来。如果字段的值是双引号,使用两个双引号表示一个转义。
    • 表头可选,和字段列对齐就行了。
  • 手动生成csv文件

from pathlib import Path
p = Path('F:/work/001/a/myfile.csv')
parent = p.parent
if not parent.exists():    
    parent.mkdir(parents=True)
    
csv_body = '''
\id,name,age,comment
1,zs,18,"I'm 18"
2,ls,20,"this is a ""test"" string."
3,ww,23,
"hello world"
'''

with p.open('w+') as f:
    f.write(csv_body)

csv 模块
  • reader(csvfile, dialect=‘excel’, **fmtparams),返回reader对象,是一个行迭代器。 默认使用excel方言,如下:

    • delimiter 列分隔符,逗号
    • lineterminator 行分隔符\r , \n
  • quotechar 字段的引用符号,缺省为" 双引号

  • 双引号的处理

    • doublequote 双引号的处理,默认为True。如果碰到数据中有双引号,而quotechar也是双引号,True则使用2个双引号表示,False表示使用转义字符将作为双引号的前缀
    • escapechar 一个转义字符,默认为None
    • writer = csv.writer(f, doublequote=False, escapechar=’@’) 遇到双引号,则必须提供转义字符
  • quoting 指定双引号的规则

    • QUOTE_ALL 所有字段
    • QUOTE_MINIMAL特殊字符字段,Excel方言使用该规则
    • QUOTE_NONNUMERIC非数字字段
    • QUOTE_NONE都不使用引号。
  • writer(csvfile, dialect=‘excel’, **fmtparams), 返回DictWriter的实例。主要方法有writerow、writerows。writerow(iterable)

from pathlib import Path
from os import path
import os
import csv

p = Path('f:work/003/a.csv')
csv_body = '''\
id,name,age,comment
1,zs,18,"I'm 18"
2,ls,20,"this is a ""test"" string."
3,ww,23,
"hello world"
'''

with p.open('w+') as f1:
   f1.write(csv_body)

rows=[
[1,"zs",18,"I'm 18"],
[2,"ls",20,"this is a ""test"" string."],
[3,"ww",23,]
]

with open(p, 'a', newline= '') as f1:
   writer = csv.writer(f1)
   writer.writerows(rows)
   print(f1)
   
with open(p, newline='') as f1:
   body = csv.reader(f1)
   #     print(body)
   for line in body:
       print(line, type(line))

-------------------------------------------------------
<_io.TextIOWrapper name='f:work\\003\\a.csv' mode='a' encoding='cp936'>
['id', 'name', 'age', 'comment'] <class 'list'>
['1', 'zs', '18', "I'm 18"] <class 'list'>
['2', 'ls', '20', 'this is a "test" string.'] <class 'list'>
['3', 'ww', '23', ''] <class 'list'>
['hello world'] <class 'list'>
['1', 'zs', '18', "I'm 18"] <class 'list'>
['2', 'ls', '20', 'this is a test string.'] <class 'list'>
['3', 'ww', '23'] <class 'list'>
  • 说明row行,需要一个可迭代对象就可以,可迭代的每一个元素,将作为csv行的每一个元素。windows下在会在每行末尾多出一个\r,解决办法open(‘test.csv’, ‘w’, newline=’’)

ini 文件处理

ini 配置文件

[DEFAULT]   #此处的的section 为缺省值必须是大写
a = test

[mysql]
default=utf8
a = 1000

[mysqld]
dataport = 33060
character=utf8
sql=xyz

中括号里面的部分称为section,译作节、区、段。每一个section内,都是key=value形成的键值对,key称为option选项。注意这里的DEFAULT是缺省section的名字,必须大写.

configparser

configparser模块的ConfigParser类就是用来操作。可以将section当做key,(例如’[mysql]'当做key,'a=100’当做value),section存储着键值对组成的字典,可以把ini配置文件当做一个嵌套的字典。默认使用的是有序字典


import configparser   #导入configparser模块的ConfigParser类
cfg = configparser.ConfigParser()    # 实例化一个对象
# read_ok = cfg.read('f:work/test/test0.ini')
read_ok = cfg.read(['f:work/test/test0.ini','f:work/001/abc.ini','f:work/002/abc.ini'])
print(read_ok)

print(cfg.sections())
print(cfg.default_section)
print(cfg._sections)  用这种方法直接读取到内部的k,v对
------------------------------------------------------------
['f:work/test/test0.ini'] # f:work/001/abc.ini,f:work/002/abc.ini,不存在,读取失败
['mysql', 'mysqld']
DEFAULT
OrderedDict([('mysql', OrderedDict([('default', 'utf8'), ('a', '1000')])), ('mysqld', OrderedDict([('dataport', '33060'), ('character', 'utf8'), ('sql', 'xyz')]))])
使用for循环遍历
for k,v in cfg.items():
    print(type(k),k,type(v),v)
------------------------------------------------------------
<class 'str'> DEFAULT <class 'configparser.SectionProxy'> <Section: DEFAULT>
<class 'str'> mysql <class 'configparser.SectionProxy'> <Section: mysql>
<class 'str'> mysqld <class 'configparser.SectionProxy'> <Section: mysqld>
for k,v in cfg.items('mysqld'):
    print(type(k),k,type(v),v)
------------------------------------------------------------
<class 'str'> a <class 'str'> test   # 拿到缺省[DEFAULT]中的test
<class 'str'> dataport <class 'str'> 33060
<class 'str'> character <class 'str'> utf8
<class 'str'> sql <class 'str'> xyz
x = cfg.get('mysqld','sql')   #对配置文件取区段mysqld下的值
print(x,type(x))
cfg.set('mysqld','a','123')   #对配置文件取区段mysqld下写入 a = 123,必须都是字符串
print(cfg.get('mysqld','a'))
------------------------------------------------------------
xyz <class 'str'>
123
  • 最后写入磁盘(存盘)
with open('f:work/test/test0.ini','w') as f:
    cfg.write(f)

  • 读取ini文件,可以是单个文件,也可以是文件列表。可以指定文件编码
    read(filenames, encoding=None)
read_ok = cfg.read(['f:work/test/test0.ini','f:work/001/abc.ini','f:work/002/abc.ini'])
  • sections()返回section列表。缺省section不包括在内
print(cfg.sections())
------------------------------------------------------------
['f:work/test/test0.ini']
  • add_section(section_name)增加一个section
  • has_section(section_name)判断section是否存在
  • options(section)返回section的所有option,会追加缺省section的option
cfg.options('mysqld')
------------------------------------------------------------
['dataport', 'character', 'sql']
  • 从指定的段的选项上取值,如果找到返回,如果没有找到就去找DEFAULT段有没有。
    get(section, option, *, raw=False, vars=None[, fallback])
x = cfg.get('mysqld','sql')   #对配置文件取区段mysqld下的值
print(x,type(x))
cfg.set('mysqld','a','123')   #对配置文件取区段mysqld下写入 a = 123,必须都是字符串
print(cfg.get('mysqld','a'))
------------------------------------------------------------
xyz <class 'str'>
123
  • getint(section, option, *, raw=False, vars=None[, fallback])
  • getfloat(section, option, *, raw=False, vars=None[, fallback])
  • getboolean(section, option, *, raw=False, vars=None[, fallback])
  • 上面3个方法和get一样,返回指定类型数据

  • items(raw=False, vars=None)
  • items(section, raw=False, vars=None
  • 没有section,则返回所有section名字及其对象;如果指定section,则返回这个指定的section的键值对组成二元组
for k,v in cfg._sections.items():    
    print(k,",",v)
for k,v in cfg._sections['mysqld'].items():    
    print(k,v)
------------------------------------------------------------
mysql , OrderedDict([('default', 'utf8'), ('a', '1000')])
mysqld , OrderedDict([('dataport', '33060'), ('character', 'utf8'), ('sql', 'xyz'), ('a', '123')])
dataport 33060
character utf8
sql xyz
a 123
  • set(section, option, value)
    section存在的情况下,写入option=value,要求option、value必须是字符串
cfg.set('mysqld','a','123')   #对配置文件取区段mysqld下写入 a = 123,必须都是字符串
print(cfg.get('mysqld','a'))
------------------------------------------------------------
xyz <class 'str'>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值