第十七天python3 文件IO(三)
CSV文件
csv是一个被行分隔符、列分隔符化分成行和列的文本文件;
csv不指定字符编码;
行分隔符为\r\n,最后一行可以没有换行符;
列分隔符常为逗号或者制表符;
每一行称为一条记录record
字段可以使用双引号括起来,也可以不使用;如果字段中出现了双引号、逗号、换行符必须使用双引号括起来。如果字段的值是双引号,使用两个双引号表示一个转义,表头可选,和字段列对齐即可;
from pathlib import Path
csv_body = """\
id,name,age,comment
1,zhang,18,"I`m 18"
2,wang,20,"Hello BeiJing"
3,li,23,"你好,计算机"
"""
p = Path('C:/Users/Sunjingxue/Downloads/test.csv')
p.parent.mkdir(parents=True,exist_ok=True)
p.write_text(csv_body)
reader() 读取csv文件内容
import csv
csvname = "C:/Users/Sunjingxue/Downloads/test.csv"
with open(csvname) as f:
red = csv.reader(f)
print(red) #返回一个csv对象
for row in red:
#print(row) 返回一个列表
print(', '.join(row)) #返回结果
<_csv.reader object at 0x0000000001E2BC40>
id, name, age, comment
1, zhang, 18, I`m 18
2, wang, 20, Hello BeiJing
3, li, 23, 你好,计算机
#在python3.5.2环境下
In [1]: from pathlib import Path In [2]: import csv In [3]: p = Path('/root/test.csv') In [4]: with open(p) as f: #此时如果不将p转换成字符串类型,运行时会报错;
...: red = csv.reader(f)
...: for i in red:
...: print(i)
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-5e013681f47a> in <module>
----> 1 with open(p) as f:
2 red = csv.reader(f)
3 for i in red:
4 print(i)
5 TypeError: invalid file: PosixPath('/root/test.csv') In [5]: with open(str(p)) as f:
...: red = csv.reader(f)
...: for i in red:
...: print(i)
...:
['1', 'zhang', '18']
['2', 'wang', '19']
['3', 'li', '20']
#在python3.8.6环境下
from pathlib import Path
import csv
p = Path("C:/Users/Sunjingxue/Downloads/test.csv")
print(type(p))
with open(p) as f: #在3.8.6环境下则不需要将p转换成字符串类型;
re = csv.reader(f)
for i in re:
print(', '.join(i)) #并且re还是个生成器;可以用next()读取;print(next(re))
writer(csvfile,dialect='execl',**fmtparams) 返回DictWriter的实例
主要的方法有:
writerow() 读取1行
writerows() 读取多行
from pathlib import Path
import csv rows = [[4,'tom',22,'banana'],
(5,'jerry',24,'apple'),
(6,'lilei',25,'just\t"in'),
'abcdefg',
(('one','two'),('three','four'))
] row = ['序号','姓名','年龄','别名'] p = Path('C:/Users/Sunjingxue/Downloads/test.csv')
with open(p,'w',newline='') as f:
wr = csv.writer(f)
wr.writerow(row)
wr.writerows(rows)
从上面的例子可以看出,写入csv文件列表中的元素可以是列表,元组,字符串;在open()的时候,newline=‘ ’,如果不对换行符做处理,则每写一行就会加一行空白行(windows默认是\r\n),非常的影响观感;
ini文件处理
中括号里面的部分程为section,译作节、区、段;
每个section内,都是key=value形成的键值对,key称为option选项;
注意:这里的DEFAULT是缺省section的名字,必须大写;
#示例ini文件
[DEFAULT]
def = test [mysql]
my = True [mysqld]
datadir = /dbserver/data
port = 3306
character-set-server = urf8
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
configparser模块
可以将section当做key,section存储这键值对组成的字典,可以把ini配置文件当做一个嵌套的字典,默认使用的是有序字典;
read(filenames,encoding=None) 读取ini文件,可以是单个文件,也可以是文件列表,可以指定文件编码;
sections() 返回section列表,缺省section不包括在内;
options(section) 返回section的所有option,会追加缺省的section的option;
has_option(section,options) 判断section是否存在这个option;
get(section,option,*,raw=False,vars=None[,fallback]) 从指定的段的选项上取值,如果找到返回,如果没有找到就去找DEFAULT端有没有;
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一样,返回指定类型数据;
from configparser import ConfigParser filename = 'C:/Users/Sunjingxue/Downloads/test.ini'
cfg = ConfigParser()
cfg.read(filename)
#打印所有section,不包括默认section;
print(cfg.sections())
#打印section的所有options,并且会追加默认section的option;
print(cfg.options('mysqld'))
#判断指定section中的指定option是否存在
print(cfg.has_option('mysqld','port'))
#判断section是否存在;
print(cfg.has_section('client'))
#从指定的section中取指定的option的值,如果不存在则去DEFAULT找,如果DEFAULT中没有则报错
print(cfg.get('mysqld','port'))
print(cfg.get('mysqld','def'))
#返回int类型的数值
print(cfg.getint('mysqld','port'))
#返回float类型的数值
print(cfg.getfloat('mysqld','port'))
#返回布尔值类型的数值
print(cfg.getboolean('mysql','my'))
#如果指定了section,则返回该section名和option,组成二元组;如果不指定seciton,则返回所有section的类;
#######################
返回结果:
['mysql', 'mysqld', 'China']
['datadir', 'port', 'character-set-server', 'sql_mode', 'def']
True
False
3306
test
3306
3306.0
True
items(raw=False,vars=None)
items(section,raw=False,vars=None)
没有section,则返回所有section名字及其对象,如果指定section,则返回这个指定的section的键值对组成二元组;
#如果指定了section,则返回该section名和option,组成二元组;如果不指定seciton,则返回所有section的类;
print(cfg.items('mysql'))
print(cfg.items())
for k,v in cfg.items():
print(k,type(v))
print(k,cfg.items(k)) #执行结果
[('def', 'test'), ('my', 'True')]
ItemsView(<configparser.ConfigParser object at 0x0000000001DF8FD0>)
DEFAULT <class 'configparser.SectionProxy'>
DEFAULT [('def', 'test')]
mysql <class 'configparser.SectionProxy'>
mysql [('def', 'test'), ('my', 'True')]
mysqld <class 'configparser.SectionProxy'>
mysqld [('def', 'test'), ('datadir', '/dbserver/data'), ('port', '3306'), ('character-set-server', 'urf8'), ('sql_mode', 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES')]
China <class 'configparser.SectionProxy'>
China [('def', 'test'), ('gansu', 'lanzhou'), ('shanxi', 'changan')]
add_section(section_name) 增加一个section;
set(section,option,value)
section存在的情况下,写入option=value,要求option、value必须是字符串;
remove_section(section) 移除section及其所有option;
remove_section(section,option) 移除section下的option;
write(fileobject,spece_around_delimiters=True) 将当前config的所有内容写入fileobject中,一般open函数使用w模式;
if cfg.has_section('China') == True:
pass
else:
cfg.add_section('China')
with open(filename,'w') as f:
cfg.set('China', 'gansu', 'lanzhou')
cfg.set('China', 'shanxi', 'changan')
cfg.write(f)
#通过字典操作修改ini文件中的值;
#cfg['section']['option'] = 'value'
#cfg['section'] = {'option' = 'value'}
cfg['mysqld']['port'] = '3308'
cfg['mysql'] = {'my':'False'}
#修改完成之后写入文件
with open(filename,'w') as f:
cfg.write(f)
执行结果:
第十七天python3 文件IO(三)的更多相关文章
- 第十五天python3 文件IO(一)
一.文件打开 open(path,flag[,encoding][,errors]) 参数说明: path:要打开文件的路径 flag:打开方式( r:以只读的方式打开文件,文件的描述符放在文件开头 ...
- 第十六天python3 文件IO(二)
BytesIO操作 io模块中的类 from io import BytesIO 内存中,开辟的一个二进制模式的buffer,可以像文件对象一样操作它: 当close方法被调用的时候,这个buffer ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 三、文件IO——系统调用
3.1 文件描述符 文件IO 系统调用是不带缓存的,文件 I/O 系统调用不是 ANSI C 的组成部分,是 POSIX 的组成部分. 系统调用与C库: C库函数的IO 的底层还是调用系统调用 I/O ...
- 文件IO——将文件dfs的文件内容第三个字节之后的内容复制到文件dfd中
/* 使用文件IO将文件fds中的内容复制到文件fdd中去 1.创建两个文件描述符 2.使用open()方法分别以只读只写方式将文件描述符符文件连接 3.将读位置后移三位 4.将fds内容存储到缓冲区 ...
- 文件IO函数和标准IO库的区别
摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...
- Java 文件IO续
文件IO续 File类 用来将文件和文件夹封装成对象 方便对文件和文件夹的属性信息进行操作 File对象可以作为参数传递给流的构造函数 Demo1 File的构造方法 public cla ...
- 文件IO操作
前言 本文介绍使用java进行简单的文件IO操作. 操作步骤 - 读文件 1. 定义一个Scanner对象 2. 调用该对象的input函数族进行文件读取 (参见下面代码) 3. 关闭输入流 说明:其 ...
- 文件IO
在unix世界中视一切为文件,无论最基本的文本文件还是网络设备或是u盘,在内核看来它们的本质都是一样的.大多数文件IO操作只需要用到5个函数:open . read . write . lseek 以 ...
随机推荐
- MOSFET, MOS管, 开关管笔记
MOSFET, MOS管, 开关管 MOSFET, Metal-Oxide-Semiconductor Field-Effect Transistor, 金属氧化物半导体场效晶体管 常见封装 电路符号 ...
- Angular中懒加载一个模块并动态创建显示该模块下声明的组件
angular中支持可以通过路由来懒加载某些页面模块已达到减少首屏尺寸, 提高首屏加载速度的目的. 但是这种通过路由的方式有时候是无法满足需求的. 比如, 点击一个按钮后显示一行工具栏, 这个工具栏组 ...
- JavaScript 模块的循环加载(循环依赖问题分析)
简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...
- Git分离头指针
Git头指针 Git中有HEAD头指针的概念.HEAD头指针通常指向某个分支的最近一次提交,但我们也可以改变它的指向,使其指向某个commit,此时处于分离头指针的状态. 如下,改变HEAD的指向,g ...
- python之数据类型的内置方法(str, list)
目录 字符串的内置方法 移除首尾指定字符 字母大小写相关操作 判断字符串的开头或结尾是否是指定字符 字符串特殊的输出方法 拼接字符串 替换指定字符 判断是否是纯数字 查找指定字符对应的索引值 文本位置 ...
- 关于『Markdown』:第二弹
关于『Markdown』:第二弹 建议缩放90%食用 道家有云:一生二,二生三,三生万物 为什么我的帖子不是这样 各位打工人们! 自从我学了Markdown以来 发现 Markdown 语法真的要比 ...
- Python 空间名称与闭包函数
空间名称与闭包函数 名称空间 名称空间 namespaces:存放名字的地方,是对栈区的划分 名称空间在栈区中分为三种,详细的划分不同的空间,不同空间可以存放相同名字的名字 内置名称空间 存放的名字: ...
- C#获取PLC信息 (KepServer)
首先注册DLL 我这里把此DLL放到我自己的网站上了,供大家下载 https://blog.nwctwang.top/OPCDAAuto.dll 把此dll复制到C:\Windows\SysWOW64 ...
- 渗透开源工具之sqlmap安装配置环境变量教程
由于计算机安全牵涉到很多方面,建议自己在服务器上搭建自己的靶场,如何搭建靶场请订阅并查看作者上期教程,这里作者先为大家推荐一个免费开源升级靶场:https://hack.zkaq.cn/ 在封神台 ...
- go-zero 微服务实战系列(二、服务拆分)
微服务概述 微服务架构是一种架构风格,它将一个大的系统构建为多个微服务的集合,这些微服务是围绕业务功能构建的,服务关注单一的业务功能,这些服务具有以下特点: 高度可维护和可测试 松散的耦合 可独立部署 ...