侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python 文件操作的详解及实例

Python  /  管理员 发布于 7年前   372

Python 文件操作的详解及实例

一、文件操作

1、对文件操作流程

  • 打开文件,得到文件句柄并赋值给一个变量
  • 通过句柄对文件进行操作
  • 关闭文件

现有文件如下:

昨夜寒蛩不住鸣。惊回千里梦,已三更。起来独自绕阶行。人悄悄,帘外月胧明。白首为功名,旧山松竹老,阻归程。欲将心事付瑶琴。知音少,弦断有谁听。f = open('小重山') #打开文件data=f.read()#获取文件内容f.close() #关闭文件

注意:if in the win,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open(‘hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。

2、文件打开模式  

Character Meaning

'r'    open for reading (default)'w'    open for writing, truncating the file first'x'    create a new file and open it for writing'a'    open for writing, appending to the end of the file if it exists'b'    binary mode't'    text mode (default)'+'    open a disk file for updating (reading and writing)'U'    universal newline mode (deprecated)

先介绍三种最基本的模式:

# f = open('小重山2','w') #打开文件# f = open('小重山2','a') #打开文件# f.write('莫等闲1\n')# f.write('白了少年头2\n')# f.write('空悲切!3')

3、文件具体操作

f = open('小重山') #打开文件# data1=f.read()#获取文件内容# data2=f.read()#获取文件内容## print(data1)# print('...',data2)# data=f.read(5)#获取文件内容# data=f.readline()# data=f.readline()# print(f.__iter__().__next__())# for i in range(5):#   print(f.readline())# data=f.readlines()# for line in f.readlines():#   print(line)# 问题来了:打印所有行,另外第3行后面加上:'end 3'# for index,line in enumerate(f.readlines()):#   if index==2:#     line=''.join([line.strip(),'end 3'])#   print(line.strip())#切记:以后我们一定都用下面这种# count=0# for line in f:#   if count==3:#     line=''.join([line.strip(),'end 3'])#   print(line.strip())#   count+=1# print(f.tell())# print(f.readline())# print(f.tell())#tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.# print(f.read(5))#一个中文占三个字符# print(f.tell())# f.seek(0)# print(f.read(6))#read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符#terminal上操作:f = open('小重山2','w')# f.write('hello \n')# f.flush()# f.write('world')# 应用:进度条# import time,sys# for i in range(30):#   sys.stdout.write("*")#   # sys.stdout.flush()#   time.sleep(0.1)# f = open('小重山2','w')# f.truncate()#全部截断# f.truncate(5)#全部截断# print(f.isatty())# print(f.seekable())# print(f.readable())f.close() #关闭文件

接下来我们继续扩展文件模式:

# f = open('小重山2','w') #打开文件# f = open('小重山2','a') #打开文件# f.write('莫等闲1\n')# f.write('白了少年头2\n')# f.write('空悲切!3')# f.close()#r+,w+模式# f = open('小重山2','r+') #以读写模式打开文件# print(f.read(5))#可读# f.write('hello')# print('------')# print(f.read())# f = open('小重山2','w+') #以写读模式打开文件# print(f.read(5))#什么都没有,因为先格式化了文本# f.write('hello alex')# print(f.read())#还是read不到# f.seek(0)# print(f.read())#w+与a+的区别在于是否在开始覆盖整个文件# ok,重点来了,我要给文本第三行后面加一行内容:'hello 岳飞!'# 有同学说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!!# f = open('小重山2','r+') #以写读模式打开文件# f.readline()# f.readline()# f.readline()# print(f.tell())# f.write('hello 岳飞')# f.close()# 和想的不一样,不管事!那涉及到文件修改怎么办呢?# f_read = open('小重山','r') #以写读模式打开文件# f_write = open('小重山_back','w') #以写读模式打开文件# count=0# for line in f_read:  # if count==3:  #   f_write.write('hello,岳飞\n')  #  # else:  #   f_write.write(line)  # another way:  # if count==3:  #  #   line='hello,岳飞2\n'  # f_write.write(line)  # count+=1# #二进制模式# f = open('小重山2','wb') #以二进制的形式读文件# # f = open('小重山2','wb') #以二进制的形式写文件# f.write('hello alvin!'.encode())#b'hello alvin!'就是一个二进制格式的数据,只是为了观看,没有显示成010101的形式

注意1: 无论是py2还是py3,在r+模式下都可以等量字节替换,但没有任何意义的! 

注意2:有同学在这里会用readlines得到内容列表,再通过索引对相应内容进行修改,最后将列表重新写会该文件。

这种思路有一个很大的问题,数据若很大,你的内存会受不了的,而我们的方式则可以通过迭代器来优化这个过程。 

补充:rb模式以及seek

在py2中:

#昨夜寒蛩不住鸣.f = open('test','r',) #以写读模式打开文件f.read(3)# f.seek(3)# print f.read(3) # 夜# f.seek(3,1)# print f.read(3) # 寒# f.seek(-4,2)# print f.read(3) # 鸣

在py3中:

# test: 昨夜寒蛩不住鸣.f = open('test','rb',) #以写读模式打开文件f.read(3)# f.seek(3)# print(f.read(3)) # b'\xe5\xa4\x9c'# f.seek(3,1)# print(f.read(3)) # b'\xe5\xaf\x92'# f.seek(-4,2)# print(f.read(3))  # b'\xe9\xb8\xa3'#总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的#   unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode#   直接传送bytes就好了,所以这个时候用rb模式.#   在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,#   但在py3里你就必须声明好了f的类型是rb,不允许再模糊.#建议: 以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.

4、with语句

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('log','r') as f:    pass

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open('log1') as obj1, open('log2') as obj2:  pass2

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


  • 上一条:
    浅谈python中列表、字符串、字典的常用操作
    下一条:
    python Socket之客户端和服务端握手详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客