Python 文件操作的详解及实例


Posted in Python onSeptember 18, 2017

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中处理时间的几种方法小结
Apr 09 Python
教你学会使用Python正则表达式
Sep 07 Python
Django中Forms的使用代码解析
Feb 10 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
python numpy和list查询其中某个数的个数及定位方法
Jun 27 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
python实现弹跳小球
May 13 Python
python批量爬取下载抖音视频
Jun 17 Python
python3.7简单的爬虫实例详解
Jul 08 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
Django中提示消息messages的设置方式
Nov 15 Python
python Socket之客户端和服务端握手详解
Sep 18 #Python
Python基于time模块求程序运行时间的方法
Sep 18 #Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 #Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 #Python
Python实现输出程序执行进度百分比的方法
Sep 16 #Python
Python实现求笛卡尔乘积的方法
Sep 16 #Python
轻松理解Python 中的 descriptor
Sep 15 #Python
You might like
编译问题
2006/10/09 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
几种tab切换详解
2017/02/03 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
python实现简易动态时钟
2018/11/19 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
清洁工岗位职责
2014/01/29 职场文书
新学期决心书
2014/03/11 职场文书
行政监察建议书
2014/05/19 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
联谊活动总结范文
2015/05/09 职场文书
学困生转化工作总结
2015/08/13 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
岗位聘任协议书
2015/09/21 职场文书