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

文件的读和写在程序中是最常见的操作之一,比如程序一启动就要加载配置文件(读),程序在运行的时候,要记录日志(写),等等,这些我们就称为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中,然后,用的时候读取其中的内容,根据内容,我们来完成相关的日志记录工作。

 


 

本篇结束!

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值