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

来源:互联网 发布:淘宝网店推广费用 编辑:程序博客网 时间:2024/06/11 11:44

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


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


IO编程


I   -->Input    -->输入流

O -->Output -->输出流


由于数据都是先存在于内存中的,这里的数据,可能来自于磁盘的某个文件,也有可能来自于网络中的一次http请求的响应结果,还有可能来自于外部接口设备等等,不管这些数据来来源于哪,都会涉及到二次流(输入流和输出流)操作,操作的人物就是我们的CPU,它将数据流写进内存或从内存中读出来,下面,举一个简单的例子来演示一下:



我们当前的路径下,有一个index.html,其中的内容我们已经写好,当然,获得其中的内容很容易,记事本或者浏览器都可以打开查看内容,但也仅仅限于本地浏览,如果想要其他用户也能看的到,我们怎么做呢?


原理很简单,利用socke套接字,基于IO编程,实现客户端和服务端之间的数据流交互。


我们把浏览器当做要连接请求的客户端


QQ浏览器


我们服务端的demo如下:


test.py


#!/urs/bin/env Python3# -*- encoding:utf-8 -*-import socketfile = 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,timeconfig = 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中,然后,用的时候读取其中的内容,根据内容,我们来完成相关的日志记录工作。


本篇结束!