18 - csv文件-ini文件处理
1 CSV文件
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
# 下面都是csv文件的内容格式
1,2,3,4,5
1,2,"1,3"
1,2,"a,""f"
- CSV 是一个被行分隔符、列分隔符划分成行和列的文本文件。
- CSV 不指定字符编码。
它有以下规范:
- 行分隔符为\r\n,最后一行可以没有换行符
- 列分隔符常为逗号或者制表符。每一行称为一条记录record
- 字段可以使用双引号括起来,也可以不使用。如果字段中出现了双引号、逗号、换行符必须使用双引号括起来。
- 如果字段的值是双引号,需要额外使用一个个双引号,表示一个转义。
- 表头可选,和字段列对齐就行了。
1.1 手动生成一个csv文件
只需要打开一个文件,按照CSV的格式,编写内容,然后写入文件中去即可。
from pathlib import Path
p = Path(r'E:\Python - base - code\chapter06文件\test.csv')
p.touch()
csv_body = '''\
no,name,age,comment
1,daxin,20,"I Like Cat"
2,tom,30,"I Like Movice"
3,ben,40,"I""m super man # "" 表示"
4xyz"
'''
with open(p,'a+') as f:
f.write(csv_body)
1.2 cvs模块
Python提供的csv模块用于处理csv文件,主要通过读(reader)
和写(writer)
两种方式:
1.2.1 reader方法
csv模块的reader方法,用于读模式打开一个csv文件,返回一个reader对象
,是一个行迭代器
。它的基本格式为:
csv.reader(iterable, dialect='excel',**fmtparams)
dialect
:表示使用excel的方言(标准)去读取**fmtparams
: 对excel的规范进行自定义设置
可以设置的参数有:
- delimiter:列分隔符(逗号)
- lineterminator:行分隔符\r\n
- quotechar:字段的引用符号,缺省为 " 双引号
- 双引号的处理(
一般使用doublequote=True
,按照默认的来)- doublequote 双引号的处理,默认为True。如果碰到数据中有双引号,而quotechar也是双引号,doublequote=True时,则使用2个双引号表示,False表示使用转义字符将作为双引号的前缀
- escapechar 一个转义字符,默认为None
- writer = csv.writer(f, doublequote=False, escapechar='@') 遇到双引号,则必须提供转义字符
- quoting 指定双引号的规则
- QUOTE_ALL 所有字段
QUOTE_MINIMAL
特殊字符字段,Excel方言使用该规则- QUOTE_NONNUMERIC非数字字段
- QUOTE_NONE都不使用引号。
建议都是用默认规则
from pathlib import Path
import csv
p = Path(r'E:\Python - base - code\chapter06文件\test.csv')
with open(p, 'r') as f:
reader = csv.reader(f)
print(next(reader)) # ['no', 'name', 'age', 'comment'] 逗号分隔好的一行列表
for line in reader:
print(line)
# ['no', 'name', 'age', 'comment']
# ['1', 'daxin', '20', 'I Like Cat']
# ['2', 'tom', '30', 'I Like Movice']
# ['3', 'ben', '40', 'I"m super man\n4xyz']
1.2.2 writer方法
csv模块的writer方法,用于写模式打开一个csv文件,返回一个DictWriter对象
。它的基本格式为:
writer(fileobj, dialect='excel', *args, **kwargs):
它包含两个主要的方法:
writerow(row)
:写一行writerows(rows)
:写多行
注意,这里的row需要是一个列表
from pathlib import Path
import csv
p = Path(r'E:\Python - base - code\chapter06文件\test.csv')
rows = [
['1', 'daxin', '20', 'I Like Cat'],
['2', 'tom', '30', 'I Like Movice'],
['3', 'ben', '40', 'I"m super man\n4xyz']
]
with open(p, 'a+') as f:
writer = csv.writer(f)
writer.writerow(rows[0]) # 写一行
writer.writerows(rows) # 写多行
观察生成好的csv文件,发现每一行,后面都会多一行空行,这是因为在写的时候把一行文本的结尾\r\n转换成两个回车写入的,所以官方建议我们在打开文件的时候,添加newline=''
参数,来组织替换。读取时也可以使用newline参数(不会影响原来的读取效果)
with open(p, 'a+', newline='') as f:
writer = csv.writer(f)
writer.writerow(rows[0]) # 写一行
writer.writerows(rows) # 写多行
2 ini文件处理
作为配置文件,ini文件格式很流行。著名的配置文件还有:json,yaml,xml等。下面是一个ini格式的文件(mariadb就是用的是这种格式的配置文件)
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
其中:
中括号
里面的部分称为section
,译作节、区、段。- 每一个section内,都是key=value形成的键值对,
key
称为option
选项。
2.1 configparser模块
configparser模块的ConfigParser类就是用来操作ini文件的。可以将section当做key,section存储着键值对组成的字典,可以把ini配置文件当做一个嵌套的字典。默认使用的是有序字典。
注意:在Python中的configparser库中,DEFAULT是缺省section的名字,必须大写,必须存在。当其他section中不存在某个option中时,会在DEFAULT中寻找对应的option,如果不存在则提示异常或者调用fallback。
ConfigParser对象中有很多方法,其中与读取配置文件,判断配置相关的方法有:
read
: 读取一个ini配置文件sections
:返回一个包含所有章节的列表has_sections
:判断章节是否存在items
:以元祖的形式返回所有的选项options
:返回一个包含章节下所有选项的列表has_option
:判读某个选项是否存在get
、getboolean
、getinit
、getfloat
:获取选项的值
ConfigParser对象也提供了许多方法便于我们修改配置文件:
remove_section
:删除一个章节add_section
:添加一个章节remote_option
:删除一个选项set
:添加一个选项(写入的所有值,都是字符串)write
:将ConfigParser对象中保存的数据保存的文件中去
2.2 常用方法
2.2.1 读取配置配件
解析一个配置文件,需要先创建一个ConfigParser对象,创建ConfigParser对象时有多个参数,其中比较重要的是allow_no_value
,allow_no_value默认取值为False
,表示在配置文件中是否允许有没有选项的值的情况。默认情况下每个选项都应该有一个值,但是在一些特殊的应用选项下,选项存在即为真,不存在即为假,比如MySQL的配置文件skip-external-locking。所以如果需要解析这样的参数,那么就需要在实例化的时候添加allow_no_value 为True
config.read(filenames, encoding=None,allow_no_value=False):
读取ini文件,可以是单个文件,也可以是文件列表。可以指定文件编码。
2.2.2 section操作
- sections() 返回section列表。缺省section不包括在内。
- add_section(section_name) 增加一个section。
- has_section(section_name) 判断section是否存在
- remove_section(section):移除section及其所有option
2.2.3 option操作
- options(section) 返回section的所有option,会追加缺省section的option
- has_option(section, option) 判断section是否存在这个option
- items(section, raw=False, vars=None):没有section,则返回所有section名字及其对象,如果指定section,则返回这个指定的section的键值对组成二元组。
- remove_option(section, option):移除section下的option。
2.2.4 获取value
- get(section, option, *, raw=False, vars=None[, fallback]):从指定的段的选项上取值,如果找到返回,如果没有找到就去找DEFAULT段有没有,如果还没有,则看fallback是否指定,没有则直接抛出异常,否则返回fallback。
- getint(section, option, *, raw=False, vars=None[, fallback]):同get方式,结果会使用int函数转换
- getfloat(section, option, *, raw=False, vars=None[, fallback]):同get方式,结果会使用float函数转换
- getboolean(section, option, *, raw=False, vars=None[, fallback]):同get方式,结果会使用bool函数转换
2.2.5 设置value
- set(section, option, value):section存在的情况下,写入option=value,要求option、value必须是字符串。
2.2.6 保存修改后的配置文件
- write(fileobject, space_around_delimiters=True):将当前config的所有内容写入fileobject中,一般open函数使用w模式。
2.3 字典的访问方式
对Configparser对象的操作还可以使用字典的方式:
from configparser import ConfigParser
from pathlib import Path
p = Path('mysql.ini')
config = ConfigParser()
config.read(p)
config['daxin'] = {'name':'daxin','age':20} # 新建一个section
print(config['daxin']['name']) # daxin
在Configparser内部,其实使用的就是一个OrderDict存储的
18 - csv文件-ini文件处理的更多相关文章
- 91.生成ini文件并写入和读取ini文件
写入 WritePrivateProfileStringA("hello money", infx[i].name, money, "1.ini"); 按照字符 ...
- Python的csv文件(csv模块)和ini文件(configparser模块)处理
Python的csv文本文件(csv模块)和ini文本文件(configparser模块)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.csv文件 1>.CSV文件 ...
- boost::property_tree读取解析ini文件--推荐
boost::property_tree读取解析ini文件 #include "stdafx.h" #include <iostream> #include <b ...
- C++ 中使用boost::property_tree读取解析ini文件
boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是 ...
- 关于C#操作INI文件的总结
原文:关于C#操作INI文件的总结 INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]key 1 = value2key 1 = value2--[S ...
- 实战parse_ini_file()及扩展函数解析ini文件完整版
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/587 在PHP站点开发的过程中,往往会用到读取ini參数配置文件,比方须要訪问一些复杂的借 ...
- shiro解析ini文件
来吧,看看shiro是怎么解析ini文件的,这里假设ini文件在classpath下,名字叫做shiro.ini Factory<org.apache.shiro.mgt.SecurityMan ...
- 一文综述python读写csv xml json文件各种骚操作
Python优越的灵活性和易用性使其成为最受欢迎的编程语言之一,尤其是对数据科学家而言.这在很大程度上是因为使用Python处理大型数据集是很简单的一件事情. 如今,每家科技公司都在制定数据战略. ...
- Python基础之读取ini文件
基本使用方法 第一步:准备一份INI文件.如test1.ini [ITEMS] item1=1 item2=2 item3=3 item4=4 [ITEM1] test1=aaa [ITEM2] te ...
随机推荐
- ubuntu在终端使用的常用命令
1.ubuntu系统显示IP地址:ifconfig 2.ubuntu系统文件命令: cat:显示文本文件内容,全部文本.格式:cat filename more:显示文件内容,分页显示,回车逐行下翻. ...
- BZOJ5294 BJOI2018二进制(线段树)
二进制数能被3整除相当于奇数.偶数位上1的个数模3同余.那么如果有偶数个1,一定存在重排方案使其合法:否则则要求至少有两个0且至少有3个1,这样可以给奇数位单独安排3个1. 考虑线段树维护区间内的一堆 ...
- 简明Python教程自学笔记——命令行通讯录
[前言]学习Python已经有一段时间了,相关的书籍资料也下载了不少,但是没有一本完整的看完,也没有编出一个完整的程序.今天下午比较清闲就把<简明Python教程>看了一遍,然后根据书里面 ...
- Linux内核设计第七周学习总结 Linux内核如何装载和启动一个可执行程序
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 实验目的 使用gdb跟踪s ...
- bzoj2757【scoi2012】Blinker的仰慕者
题目描述 Blinker 有非常多的仰慕者,他给每个仰慕者一个正整数编号.而且这些编号还隐藏着特殊的意义,即编号的各位数字之积表示这名仰慕者对Blinker的重要度. 现在Blinker想知道编号介于 ...
- javascript实现div的显示和隐藏
http://www.cnblogs.com/oec2003/archive/2007/05/05/736492.html <html> <head> <meta htt ...
- sql数据库设计学习---数据库设计规范化的五个要求
http://blog.csdn.net/taijianyu/article/details/5945490 一:表中应该避免可为空的列: 二:表不应该有重复的值或者列: 三: 表中记录应该有一个唯一 ...
- 利用VisualStudio单元测试框架举一个简单的单元测试例子
本随笔很简单,不涉及mock和stub对象,而是只给出一个简单的利用Visual Studio单元测试框架的最简单例子.如果需要深入理解Unit Test的原理与艺术,请参考<The art o ...
- VMware 安装Ubuntu16.04时显示不全的解决方法
实际安装时发现进行到分区这个步骤时,看不到下面的按钮, 百度后得知有此遭遇的不在少数,是因为系统默认分辨率与电脑分辨率的差异导致的. 解决方法也很简单粗暴: 左手按住alt键右手鼠标往上拖动安装界面, ...
- 【转载】14个你可能不知道的 JavaScript 调试技巧
了解你的工具可以极大的帮助你完成任务.尽管 JavaScript 的调试非常麻烦,但在掌握了技巧 (tricks) 的情况下,你依然可以用尽量少的的时间解决这些错误 (errors) 和问题 (bug ...