一、x模式(控制文件操作模式,与rwa同级)

1 特点

创建不存在文件,文件存在则报错

可写不可读

2 格式

  1. with open('d.txt',mode='x',encoding='utf-8') as f:
  2. f.write('哈哈哈\n')
  3. #d文件存在则报错,不存在则创建并写入哈哈哈

二、b模式(控制文件读写内容的模式,与t同级)

1.b模式和t模式的区别

t模式:

  1. 读写都必须是以字符串(uncode)为单位
  2. 只能针对文本文件
  3. 必须指定字符编码,即必须指定encoding参数
  4. 硬盘的二进制读入内存-》t模式会直接把内存中的二进制encode解码

b模式(binary):

  1. 读写都是以bytes为单位
  2. 可以针对所有文件
  3. 一定不能指定字符编码,即一定不能指定encoding参数
  4. 硬盘中的二进制读入内存-》b模式下不会做任何操作,直接读入内存

总结:在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码和解码,所以t在纯文本的操作上更方便。非纯文本文件只能用b模式

2 b模式应用

  1. with open("a.txt","rb") as f :
  2. print(f.read().decode("utf-8"))
  3. #在b模式下如果想读文本文件,必须要以源文件存的方式解码,如果没有这一步操作输出的是一个bytes类型
  4. #同理,在写文件的时候,就要以文件同样格式去编码
  5. with open(r"cvc.txt","wb") as f :
  6. f.write("aaaa".encode("utf-8"))

3 循环读取文件

方式一:自己控制每次读取的数据的数据量(while)

  1. with open(r"cvc.txt","rb") as f :
  2. while True:
  3. res = f.read(5)#控制每次只读5个字节的数据
  4. print(res)
  5. if len(res) == 0:
  6. break

方式二:每次读一行(for)

  1. with open(r"cvc.txt","rb") as f :
  2. for line in f:
  3. print(line)

三、文件操作的其他方法

1 读相关操作

1.1readline:一次读一行

  1. with open(r"cvc.txt","rt",encoding="utf-8") as f :
  2. res = f.readline()
  3. print(res)

1.2readlines:把文件内容存放到列表内,以换行符分隔

  1. with open(r"cvc.txt","rt",encoding="utf-8") as f :
  2. res = f.readlines()
  3. print(res)
  4. >>>['aaaa\n', '12321\n', '123123\n', '123123\n', '12321\n', '213312\n', '123\n', '123']

强调:read和readlines都是将文件所有的内容读到内存中,如果文件过大,容易内存溢出

2 写相关操作

2.1writelines:readlines的反操作,把列表中的数据写到文件中

  1. with open(r"cvc.txt","wt",encoding="utf-8") as f :
  2. f.writelines(["aaa","BBB"])#不能写数字

补充1:b模式下,如果是纯英文和数字可以在前面加b前缀得到bytes类型

  1. l = [
  2. b'1111aaa1\n',
  3. b'222bb2',
  4. b'33eee33'
  5. ]
  6. l = [
  7. '1111aaa1\n'.encode('utf-8'),
  8. '222bb2'.encode('utf-8'),
  9. '33eee33'.encode('utf-8')
  10. ]
  11. #这两者效果相同

补充2:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')

3 flsh刷新

  1. with open('h.txt', mode='wt',encoding='utf-8') as f:
  2. f.write('哈')
  3. f.flush()
  4. #操作系统在把应用程序的数据写入文件时不是瞬时的,需要攒到一定量再执行,flush可以忽略这个设定直接执行。

4 了解

  1. with open('h.txt', mode='wt',encoding='utf-8') as f:
  2. print(f.readable())#判断文件是否可读
  3. print(f.writable())#判断文件是否可写
  4. print(f.encoding)#读取文件存放的字符编码
  5. print(f.name)#读取文件名称
  6. print(f.closed)#判断文件是否关闭
  7. >>>False
  8. >>>True
  9. >>>utf-8
  10. >>>h.txt
  11. >>>True

四、文件高级操作:控制文件指针的移动

前提:文件指针移动的单位是bytes

只有一种情况下特殊,t模式我们读取文件时,获得的是字符串,所以这个时候指针移动的单位是字符

  1. with open('aaa.txt',mode='rt',encoding='utf-8') as f:
  2. res=f.read(4)
  3. print(res)

f.seek(n,模式)n代表的是移动的字节数

1 模式0:参照物是文件开头

  1. with open(r"cvc.txt","rb") as f :
  2. f.seek(5,0)#从开头把光标移动到底5个字节处
  3. f.seek(111,0)#从开头把光标移动到第111字节处,如果没有这么多,就移到最后一个

2 模式1:参照物是光标当前所在位置

  1. with open(r"cvc.txt","rb") as f :
  2. f.seek(3,1)#在第三个字节处
  3. f.seek(1,1)#在第四个字节处

3 模式2:参照物是文件末尾,应该是倒着移动的n为负数

  1. with open(r"cvc.txt","rb") as f :
  2. f.seek(-1,2)#在文件倒数第一个字节处
  3. f.seek(-2,2)#在文件倒数第二个字节处

强调 0模式可以在t模式下使用,1,2模式只能在b模式下使用

4 tell获取文件当前光标所在位置

  1. with open(r"cvc.txt","rb") as f :
  2. f.seek(-1,2)
  3. f.seek(-2,2)
  4. res = f.tell()
  5. print(res)
  6. >>>3

五、文件修改

强调

  1. 硬盘空间是无法修改的,硬盘中的数据的更新都是用新的值取覆盖旧的值
  2. 内存中的数据是可以修改的
  1. # 文件a.txt内容如下
  2. 张一蛋 山东 179 49 12344234523
  3. 李二蛋 河北 163 57 13913453521
  4. 王全蛋 山西 153 62 18651433422
  5. # 执行操作
  6. with open('a.txt',mode='r+t',encoding='utf-8') as f:
  7. f.seek(9)
  8. f.write('<妇女主任>')
  9. # 文件修改后的内容如下
  10. 张一蛋<妇女主任> 179 49 12344234523
  11. 李二蛋 河北 163 57 13913453521
  12. 王全蛋 山西 153 62 18651433422

因此如果需要修改文件,只能把文件的数据从硬盘读到内存中,然后在内存中修改最后覆盖源文件

方式一

  1. #实现思路:讲文件的内容一次性全部读入内存中,然后再内存中修改,最后覆盖原文件
  2. #优点:在文件修改的过程中只有一个文件
  3. #缺点:一次性读入内存会过多占用内存空间
  4. with open("b.txt","r",encoding="utf-8") as f :
  5. info = f.read()
  6. with open("b.txt","w",encoding="utf-8") as f1:
  7. f1.write(info.replace("a","b"))

方式二

  1. #实现思路:打开原文件的同时,创建一个临时文件,把原文件的数据一行一行的读入内存,再保存到临时文件,最后把原文件删除,重命名临时文件
  2. #优点:不会占用很多内存空间,同时出现在内存中的数据只有一行
  3. #缺点:文件修改的过程中会出现两个文件
  4. import os
  5. with open("b.txt","r",encoding="utf-8") as f1,\
  6. open(".b.txt.swap","w",encoding="utf-8") as f2:
  7. for line in f1:
  8. f2.write(line.replace("b","a"))
  9. os.remove("b.txt")
  10. os.rename(".b.txt.swap","b.txt")

day12 文件操作(下)的更多相关文章

  1. Windows与Linux下文件操作监控的实现

    一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...

  2. Linux C 下的大文件操作

    这里说的大文件指大小超过4G的文件. 在32位环境下,linux默认打开.读.写超过4G的文件会返回错误.定义如下宏可以突破这个限制,对read/write和fread/fwrite同时有效. 注意它 ...

  3. Linux下普通IO文件操作函数---C语言

    普通文件IO总结 FILE结构体    typedef struct   {       int level; /*填充/清空一级缓存*/     unsigned flag; /*文件状态指针*/ ...

  4. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  5. Linux(C/C++)下的文件操作open、fopen与freopen

    open是linux下的底层系统调用函数, fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的 ...

  6. 归纳整理Linux下C语言常用的库函数----文件操作

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  7. C# WPF Application 下的文件操作

    好气哦,电脑好烂,每天花大把的时间在等电脑反应上. 没有钱买新电脑,连组台式机的钱都没有.好气哦. 啊啊啊啊文件操作是什么鬼???C++下我都懵了,C#下好多东西要学!!!我不会!我不会!我不会!!! ...

  8. qt在linux下使用open,write,close等文件操作

    正常在linux下使用的文件操作函数为: #include <fcntl.h>fd = open(“path”,O_RDWR|O_NONBLOCK); 但是在qt中,需要使用: #incl ...

  9. Linux(C/C++)下的文件操作open、fopen与freopen via Boblim

    Linux(C/C++)下的文件操作open.fopen与freopen open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. li ...

随机推荐

  1. 关于Graph Convolutional Network的初步理解

    为给之后关于图卷积网络的科研做知识积累,这里写一篇关于GCN基本理解的博客.GCN的本质是一个图网络中,特征信息的交互+与传播.这里的图指的不是图片,而是数据结构中的图,图卷积网络的应用非常广泛 ,经 ...

  2. <WP8开发学习笔记>ApplicationBar(任务栏)的切换以及“黑条问题”

    ApplicationBar(以下简称AppBar)是WP应用相当常见的控件,也很方便.常见的做法是pivot或者panorama的页面切换的时候,AppBar跟随切换对应的按钮或者不显示按钮,如下图 ...

  3. 听说你的资源被盗用了,那你知道 Nginx 怎么防盗链吗?

    上一篇文章讲了 Nginx 中的变量和运行原理,下面就来说一个主要提供变量并修改变量的值的模块,也就是我们要讲的防盗链模块:referer 模块. 简单有效的防盗链手段 场景 如果做过个人站点的同学, ...

  4. Shell总结02-shell变量、赋值与替换

    变量 shell并不区分变量的类型,或者说变量都是弱类型的,本质上都是字符串,但是如果变量值中只含有数字,shell还是支持对其进行算术运算 赋值 常见的赋值操作符有=(在其前后没有空白符)和let ...

  5. cb36a_c++_STL_算法_区间的比较equal_mismatch_lexicographical_compare

    *cb36a_c++_STL_算法_区间的比较equal_mismatch_lexicographical_compare 区间:容器中的全部数据或者部分数据,都叫做区间 equal(b,e,b2), ...

  6. JS新界面关闭原界面刷新的多种形式

    ------------恢复内容开始------------ 1.新界面为当前界面弹出的形式: 第一步:首先原界面的原生JS事件需要放到 (function () {  ......  })(); 中 ...

  7. MySQL语句的使用

    进入数据库  mysql -u root -pmysql    (u用户名,p密码)#如果不想让其他人看到就直接一个p然后回车再打密码 select version();   查看数据库版本 sele ...

  8. WeChair项目Beta冲刺(5/10)

    团队项目进行情况 1.昨日进展    Beta冲刺第五天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑开发,预约用座 ...

  9. easymock笔记2

    EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest. EasyMock 可以mock interface和抽象java 类,但是不可以mock拥有被final ...

  10. drf-Authentication认证

    drf-Authentication认证 ## 源码分析 ```python """ 1)APIView的dispath(self, request, *args, ** ...