标签:lin imp 写入 block 情况下 字符串 文件 readlines 文件句柄
操作系统提供的一种调用计算机硬件的的工具, 用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。
需要通过文件来调用硬件和保存数据
open()
f = open(‘文件路径‘,‘打开文件的模式‘,‘指定的字符编码‘)
f:文件句柄
f.close() # 回收操作系统资源,还有个del.f表示回收变量,这个python解释器内部回收机制会自动回收,这就要求我们,在操作完毕文件后,一定要记住f.close(),虽然我们如此强调,但是大多数读者还是会不由自主地忘记f.close(),考虑到这一点,python提供了with关键字来帮我们管理上下文。
文件路径:
相对路径:在当前文件同目录及以下都可以
相对路径:D:\项目路径\day08\a.txt
文件上下文处理:
with open(‘文件路径‘,‘打开文件的模式‘,‘指定的字符编码‘)as if:
文件打开模式:(纯净模式)
r:只读
1.只能读,不能写
2.如果文件不存在的话,就会报错
w:只写:(慎用)
1.只能写,不能读
2.如果文件不存在的话,会创建新的文件
3.如果文件存在的话,先清空原内容再重新写入
a:追加写:
1.只能写,不能读件
2.如果文件存在的话,会在原数据的末尾添加新数据
补充:r+,w+,a+
表示可读可写,其他都一样
文件处理模式:
t:文本模式
只能与r\w\a连用
默认情况下,是rt模式
必须指定encoding参数
强调:t 模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,当指定 t 模式时,内部帮我们做了编码与解码
b:bytes模式
只能与r\w\a连用
处理二进制数据
一定不能指定encoding参数
强调:b模式对比t模式 1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便 2、针对非文本文件(如图片、视频、音频等)只能使用b模式
文件处理的内置方法:
读
f.read() # 读文件,一次性读出所有数据
with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘)as f: print(f.read())
f.readline() # 读取一行内容,光标移动到第二行首部
f.readlines() # 将数据全部读入内存,以换行符分割,存入列表
with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘)as f: print(f.readlines())
输出结果:[‘你好啊帅哥\n‘, ‘sean是个DSB‘]
f.readable() # 是否可读
写
f.write # 写文件,针对文本模式和b模式的写,需要自己写换行符
with open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)as f:
print(f.write(‘你好啊帅哥‘)) # 带上print返回值是五个字符
f.writable # 是否可写
f.writelines # 相当于for +write
with open(‘b.txt‘,‘w‘,encoding=‘utf-8‘)as f:
f.writelines([‘你好啊帅哥\n‘,‘sean是个DSB‘]) # 输入一个可迭代对象,然后依次输入,也可以加换行符\n
for i in f :i是可迭代对象
大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位
with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘)as f: print(f.read(3)) # 只读取三个字符
with open(‘b.txt‘,‘rb‘)as f:
print(f.read(3)) # 只读取三个bytes,而不是三个bit
?
f.seek(参数offset,参数whence):
参数offset:相对偏移度(针对的是字节) # utf-8中中文是三个字节,英文一个字节,gbk中中文两个字节,英文一个字节
参数whence:模式控制
0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
f.tell():指示当前光标所在的位置,可以打印出来
f.encoding:表示当前文件是以什么编码方式打开文件
1.第一种方式
文件a.txt内容如下
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
?
# 执行操作
with open(‘a.txt‘,mode=‘r+t‘,encoding=‘utf-8‘) as f:
f.seek(9)
f.write(‘大家‘)
# 文件修改后的内容如下
张大家 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
?
# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的
2.第二种方式
# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
?
with open(‘db.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f: data=f.read()
with open(‘db.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f: f.write(data.replace(‘kevin‘,‘SB‘))
3.第三种方式
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os with open(‘db.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as read_f,\ open(‘.db.txt.swap‘,mode=‘wt‘,encoding=‘utf-8‘) as wrife_f:
for line in read_f: wrife_f.write(line.replace(‘SB‘,‘kevin‘)) os.remove(‘db.txt‘)
os.rename(‘.db.txt.swap‘,‘db.txt‘)
标签:lin imp 写入 block 情况下 字符串 文件 readlines 文件句柄
原文地址:https://www.cnblogs.com/jiangxianseng/p/11822955.html