您的位置:首页 > 编程语言 > Python开发

Python3学习(30)--读写文件(结尾附Ini文件读取案例)

2017-09-16 17:54 736 查看
文件的读和写在程序中是最常见的操作之一,比如程序一启动就要加载配置文件(读),程序在运行的时候,要记录日志(写),等等,这些我们就称为IO操作。

本篇开始之前,先讲一下什么是

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中,然后,用的时候读取其中的内容,根据内容,我们来完成相关的日志记录工作。

本篇结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐