Python3学习(30)--读写文件(结尾附Ini文件读取案例)
2017-09-16 17:54
736 查看
文件的读和写在程序中是最常见的操作之一,比如程序一启动就要加载配置文件(读),程序在运行的时候,要记录日志(写),等等,这些我们就称为IO操作。
本篇开始之前,先讲一下什么是
IO编程
I -->Input -->输入流
O -->Output -->输出流
由于数据都是先存在于内存中的,这里的数据,可能来自于磁盘的某个文件,也有可能来自于网络中的一次http请求的响应结果,还有可能来自于外部接口设备等等,不管这些数据来来源于哪,都会涉及到二次流(输入流和输出流)操作,操作的人物就是我们的CPU,它将数据流写进内存或从内存中读出来,下面,举一个简单的例子来演示一下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/427c994a5d0ee511ccd5afc665854fab)
我们当前的路径下,有一个index.html,其中的内容我们已经写好,当然,获得其中的内容很容易,记事本或者浏览器都可以打开查看内容,但也仅仅限于本地浏览,如果想要其他用户也能看的到,我们怎么做呢?
原理很简单,利用socke套接字,基于IO编程,实现客户端和服务端之间的数据流交互。
我们把浏览器当做要连接请求的客户端
QQ浏览器
我们服务端的demo如下:
test.py
上述demo涉及socket编程,暂时不在本篇细说,后续Python3连载的时候再来好好聊一聊套接字。
默认浏览器,输入:localhost,访问的是80端口,当然,机子上基于80端口的服务没开的话,响应是失败的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/2bd1e359cd3b1f26d96cd967b5238ab9)
现在我们将服务端的demo启动起来,由于accpet函数是阻塞模式,因此,服务端启动起来,并不会立马结束,直到接收一个客户端连接请求后,执行完剩余的代码后,整个服务结束。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/a74a806a2d8bc25a30769ab53cce1cd6)
接着,客户端登场,我们在浏览器中输入:localhost:6666,来连接服务端,当然,浏览器发出的请求我们目前不知道是什么,但是,如果这个请求成功了,必然会收到来自服务端的响应数据流,这个数据流是什么呢,就是我们index.html的内容。我们来测试一下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/beb4b8b9d7b97a3210305a51bb4aac48)
我去,怎么回事,这时候,我们看一下,服务端,还处于运行状态,说明浏览器这个请求根本就没有找到组织,查看了一下,本机端口占用情况,发现6666和8888这种靓号,居然已经名花有主了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/0aec455f96eb9f294cbc6a6c2365fbc3)
我们发现,9999没有被占用,好吧,我们就换成9999,服务重新启动,再来一遍:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/467a131cc8ff40cfa659d258b5323ade)
如果上面你看明白了,下面我们讲文件的读和写操作,那就是小巫见大巫了(别看上面例子简单,那可是网络编程的核心所在啊)
文件的读
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/5b79707cc7cdcf2763675f38542d07ee)
read.py:
(1)一次只读一行---->readline()
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/a369c6ab8d1659c436f985a94eb82d9f)
(2)一次性读完 ----> read()
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/4a04c57aaaa30e455a851a5ecd46700d)
(3)一次性读完----->readlines() ---->一个list集合
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/ec2e8da65440da889d47908d59278497)
(4)一次读取N个字符-----> read(n)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/99241b924a33cd962139516fac51e699)
(5)读取指定编码的文件
比如,我们将Test.txt文件编码设置为 UTF-8
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/cb737839765b9e505381f7b31c982b95)
如果我们不指定编码为UTF-8的话,下面读取将会抛出异常
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/e79920e02d486e8b5b51bed4e5b5b622)
反之,则可以正常读取
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/19b629a3b0e4e0ccd762a1fbbe7f9565)
(6)随意指定编码的读取方式,无视系统抛出的异常,这样会造成乱码
注意:第三和第四个函数 都是关键字参数,具体可以利用help()函数,查看open函数的具体信息
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/adabe162fec3cd2604fbea2d2d80a961)
(7)关闭文件流对象
文件的写
(1)覆盖模式
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/87ce62239c9ae64a07b34595b52f5ebf)
(2)追加模式
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/1d1da5ee029630976981fe9800ab9aaa)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/985e81548e026501961e2b579461eb4b)
(3)完整的、正确的读写操作
写:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/2737c60421fbe245744a69c168a4e02b)
读:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/133fa8daea47250e60106817f52842be)
INI配置文件的读写和操作
假设,我们的mysql数据库的相关信息记录在system.ini中
直接上demo----> readIni.py:
我们看一下,当前目录下的system.ini的内容:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/6d8b224fce0b7ca68645717f28983b83)
我们运行一下我们的demo:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/f0081de52fba64d42c6a41069b4f57c1)
这个时候,我们再来看一下我们外面的system.ini文件有没有什么变化
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/8f2ed1bd9bf77284cb44ed49c24471f4)
此时,如果我们再次运行我们的demo会怎么样(前面学过异常处理,我们看一下,重复添加同一个块,会不会有异常捕获呢?)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/16/a6f1d17575e5c0a3833a3a80732e24c4)
ok,如果还意犹未尽的话,我们可以自己尝试写一个程序,来记录用户的每一次操作,也就是写个日志文件,记录操作的内容和操作的时间,当然,我们也可以做个任务,将任务的相关信息写进配置文件INI中,然后,用的时候读取其中的内容,根据内容,我们来完成相关的日志记录工作。
本篇结束!
本篇开始之前,先讲一下什么是
IO编程
I -->Input -->输入流
O -->Output -->输出流
由于数据都是先存在于内存中的,这里的数据,可能来自于磁盘的某个文件,也有可能来自于网络中的一次http请求的响应结果,还有可能来自于外部接口设备等等,不管这些数据来来源于哪,都会涉及到二次流(输入流和输出流)操作,操作的人物就是我们的CPU,它将数据流写进内存或从内存中读出来,下面,举一个简单的例子来演示一下:
我们当前的路径下,有一个index.html,其中的内容我们已经写好,当然,获得其中的内容很容易,记事本或者浏览器都可以打开查看内容,但也仅仅限于本地浏览,如果想要其他用户也能看的到,我们怎么做呢?
原理很简单,利用socke套接字,基于IO编程,实现客户端和服务端之间的数据流交互。
我们把浏览器当做要连接请求的客户端
QQ浏览器
我们服务端的demo如下:
test.py
#!/urs/bin/env Python3 # -*- encoding:utf-8 -*- import socket file = open('index.html', 'r') html_content =file.read() #读取index.html的内容 serSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #基于TCP协议 serSock.bind(("",6666))#(绑定)本机,6666端口 serSock.listen(5) #(监听)客户端socket连接数量 cliSock,addr = serSock.accept() #返回一个tuple对象,内容:一个socket,一个地址 print(cliSock.recv(1024)) #输入流 来自于客户端的请求 cliSock.send(html_content.encode('utf-8')) #输出流 响应客户端的请求 #为了方便演示,我们只accept一次,最后别忘关闭资源 file.close() serSock.close() cliSock.close()
上述demo涉及socket编程,暂时不在本篇细说,后续Python3连载的时候再来好好聊一聊套接字。
默认浏览器,输入:localhost,访问的是80端口,当然,机子上基于80端口的服务没开的话,响应是失败的:
现在我们将服务端的demo启动起来,由于accpet函数是阻塞模式,因此,服务端启动起来,并不会立马结束,直到接收一个客户端连接请求后,执行完剩余的代码后,整个服务结束。
接着,客户端登场,我们在浏览器中输入:localhost:6666,来连接服务端,当然,浏览器发出的请求我们目前不知道是什么,但是,如果这个请求成功了,必然会收到来自服务端的响应数据流,这个数据流是什么呢,就是我们index.html的内容。我们来测试一下:
我去,怎么回事,这时候,我们看一下,服务端,还处于运行状态,说明浏览器这个请求根本就没有找到组织,查看了一下,本机端口占用情况,发现6666和8888这种靓号,居然已经名花有主了:
我们发现,9999没有被占用,好吧,我们就换成9999,服务重新启动,再来一遍:
如果上面你看明白了,下面我们讲文件的读和写操作,那就是小巫见大巫了(别看上面例子简单,那可是网络编程的核心所在啊)
文件的读
read.py:
#!/urs/bin/env Python3 # -*- encoding:utf-8 -*- ''' open函数 -->打开一个文件,并进行读写操作 常用的几个读写权限 r:读权限 (默认就是r) w:写权限 a:追加权限 ''' file = open('Test.txt','r')
(1)一次只读一行---->readline()
print(file.readline())
(2)一次性读完 ----> read()
print(file.read())
(3)一次性读完----->readlines() ---->一个list集合
clist = file.readlines() print(clist) for content in clist: #print(content.replace('\n',''))#替换掉换行 print(content.strip()) #替换掉换行
(4)一次读取N个字符-----> read(n)
print(file.read(9))
(5)读取指定编码的文件
file = open('Test.txt','r',encoding='UTF-8')
比如,我们将Test.txt文件编码设置为 UTF-8
如果我们不指定编码为UTF-8的话,下面读取将会抛出异常
反之,则可以正常读取
(6)随意指定编码的读取方式,无视系统抛出的异常,这样会造成乱码
file = open('Test.txt','r',encoding='gbk',errors='ignore')
注意:第三和第四个函数 都是关键字参数,具体可以利用help()函数,查看open函数的具体信息
(7)关闭文件流对象
file.close()
文件的写
(1)覆盖模式
file = open('Test.txt','w') file.write('Python3学习系列 之 文件的读写操作')
(2)追加模式
file = open('Test.txt','a') file.write('Python3学习系列 之 文件的读写操作--(追加模式)')
(3)完整的、正确的读写操作
#!/urs/bin/env Python3 # -*- encoding:utf-8 -*- ''' open函数 -->打开一个文件,并进行读写操作 常用的几个读写权限 r:读权限 (默认就是r) w:写权限 a:追加权限 ''' #with 自动帮我们在操作完成后释放读或写文件对象 with open('Test.txt','a',encoding='utf-8') as file: file.write('Hello Python !') with open('Test.txt','r',encoding='utf-8') as file: print(file.readline(),'当前文件指针所在字节位置:',file.tell())
写:
读:
INI配置文件的读写和操作
假设,我们的mysql数据库的相关信息记录在system.ini中
直接上demo----> readIni.py:
#!/urs/bin/env Python3 # -*- encoding:utf-8 -*- import configparser,time config = configparser.ConfigParser() config.read("system.ini") #获取INI文件里 块中的值 dbname = config.get('mysql','dbname') # 获取dbname值 user = config.get('mysql','user') # 获取dbname值 pwd = config.get('mysql','password') # 获取dbname值 print(dbname,',',user,',',pwd) #修改INI文件里 块中的值 config.set('mysql','dbname','taotao') config.set('mysql','user','appleyk') config.set('mysql','password','6666666') try: #添加新的块 config.add_section('Time') config.set("Time", "value", ''+time.ctime()) except Exception as e: print(e) finally: #不管添加块是不是成功,都将修改后的结果写进配置文件system.ini with open('system.ini','w') as f: config.write(f)
我们看一下,当前目录下的system.ini的内容:
我们运行一下我们的demo:
这个时候,我们再来看一下我们外面的system.ini文件有没有什么变化
此时,如果我们再次运行我们的demo会怎么样(前面学过异常处理,我们看一下,重复添加同一个块,会不会有异常捕获呢?)
ok,如果还意犹未尽的话,我们可以自己尝试写一个程序,来记录用户的每一次操作,也就是写个日志文件,记录操作的内容和操作的时间,当然,我们也可以做个任务,将任务的相关信息写进配置文件INI中,然后,用的时候读取其中的内容,根据内容,我们来完成相关的日志记录工作。
本篇结束!
相关文章推荐
- QT sqlite3数据库读取、容器操作、文件读写——学习笔记。
- python学习之路三(文件读写)
- python文件读写学习
- python学习:读写文件和字典排序
- Python的学习(三十一) ---- 使用ConfigParser模块读写ini文件
- python文件读写实例学习笔记
- nginx 源码学习笔记(十三)——文件读写和配置文件读取
- python读写ini文件示例(python读写文件)
- 依次读取文件中的一个字符 分类: python基础学习 python 小练习 2013-08-22 11:14 289人阅读 评论(0) 收藏
- 文件操作注意事项 分类: python 小练习 python基础学习 open()文件读写 2013-12-03 11:05 532人阅读 评论(0) 收藏
- JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)
- Python学习笔记--文件读写
- python 学习正则与文件读写 从字符串里面找出 邮箱正则
- 使用os.popen/commands.getoutput查询指定端口号的服务 分类: python 小练习 open()文件读写 python基础学习 2013-09-17 17:49 798人阅读 评论(0) 收藏
- python读写文件,分析字符串及读取目录下文件名的实践
- 【python coding 2:文件读写】读取本地文件里的ip地址,循环写入到新的文件中
- Learn Python The Hard Way学习(15) - 读取文件
- Python 学习笔记 (6)—— 读写文件
- Learn Python The Hard Way学习(16) - 读写文件
- 0702学习笔记提示和传递和文件读取读写1