想掌握python文件操作?一篇文章就够了


r只读,r+读写不创建,w新建只写,w+新建读写,二者都会讲文件内容清零(以w方式开打,不能读出。w+可读写)

w+与r+区别在于如果文件不存在则r会报错w则会创建
r+与a+区别在于r+进行了覆盖写(如果你是先写的话)

a是以追加的方式打开不可读,a+则是可以读的a的升级版

不可读的打开方式:w和a
若文件不存在则会创建新文件的打开方式:a,a+,w,w+

1.文件操作基本了解

前提要明白
1.文件的路径
2.编码方式:utf-8,gbk,gb2312…
3.操作模式:只读,只写,追加,写读,读写…

f = open('D:\xxxx.txt',mode='r',encoding='utf-8')
content = f.read()
print(content)
f.close()

参数解释:
f:就是一个变量,一般都会将它写成f,f_obj,file,f_handler,fh等,这个变量被称作文件句柄。
open:是Python调用的操作系统(windows,inux,等)的功能。
'D:\xxxx.txt:文件的路径
mode:就是定义你的操作方式:r为读模式 #具体有哪些模式见下面
encoding:不是具体的编码或者解码,他就是声明:此次打开文件使用什么编码本。一般来说:你的文件用什么编码保存的就用什么方法打开,一般都是用utf-8(有些使用的是gbk)
f.read():就是你要操作文件做什么,比如读写删等等,都必须通过文件句柄进行操作。
close():关闭文件句柄(可以把文件句柄理解成一个空间,这个空间存在在内存中,必须要主动关闭)。

有了文件的概念后,我们无需在考虑操作硬盘的细节,只需要关注操作文件的流程:

#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

#2. 通过句柄对文件进行操作
data=f.read()

#3. 关闭文件
f.close()

注意:

1.有些时候文件路径要进行转译才能正确找到
文件路径: ‘C:\Users\AA\Desktop\111.txt’ ,因为\t,\n等等有些特殊的意义不是字符串\n而是换行,这时候要加\n来表示对\进行转译,就是前面的\对\后面的\进行转译,告诉计算机这个只是想单纯的表示\路径而已
通常用r 'C:\Users\AA\Desktop\111.txt’在路径的整体前面加一个r将所有的\都进行转译(推荐)
**绝对路径:**从磁盘跟目录开始一直到文件名
**相对路径:**对于同一个文件夹下的文件,相对于当前这个程序所在的文件而言,如果在同一个文件中,则相对路径就是这个文件名,如果再上一层文件夹则要使用…/,相对路径下你就可以直接写文件名
2.当你打开文件的时候使用的编码与文件储存时的编码方式不一致,就会导致报错。

2.文件操作:读

所有带+的模式和r相关都是可读的

2.1 r模式

以只读的方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。
举例说明:

f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)

结果:  # 注意换行效果是文本中保存数据时自带的,不是python进行换行
高圆圆
刘亦菲
张柏芝
杨紫
王菲

r+模式

注意:r+模式打开一个文件用于读写,文件指针默认将会放在文件的开头
如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是做文件的最开始,你要是先写入,则写入的内容将会吧原本的内容覆盖掉,知道覆盖到你输入的内容的那个光标位置,然后在在后面开始读取。

2.1.1 read()

read将文件中的内容全部读取出来:如果你的文件很大(几个G的日志文件可以试试)就会非常占用内存,容易导致内存崩溃。

f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)

结果:
高圆圆
刘亦菲
张柏芝
杨紫
王菲

2.1.2 read(n)

read()读取的时候指定读取到什么位置
在r模式下,n按照字符读取。,如果未给定或者为负则读取所有

f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read(3)
msg1 = f.read()
f.close()
print(msg)
print(msg1)    

结果: 
高圆圆

刘亦菲
张柏芝
杨紫
王菲

2.1.3 readline()

readline()读取每次只读取一行,**注意:**readline()读取出来的数据在后面都有一个\n用来表示换行

f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline()
msg3 = f.readline()
msg4 = f.readline()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)

结果:
高圆圆

刘亦菲

张柏芝

杨紫

# 解决这个问题只需要在我们读取出来的文件后面加一个strip()就OK了 
strip()是去掉换行符和制表符和空格,推荐input的时候加上
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
msg4 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)

结果:
高圆圆
刘亦菲
张柏芝
杨紫

2.1.4 readlines()

readlines()返回一个列表,列表里面每个元素是原文件的一行,如果文件很大,就会占内存,容易崩盘
,可以填写参数,如果参数>0则会返回总和大约为参数字节的行,实际读取值可能比参数字节大,因为需要填充缓冲区

f = open('log',encoding='utf-8')
print(f.readlines())
f.close()
# 结果['666666\n', 'fkja l;\n', 'fdkslfaj\n', 'dfsflj\n', 'df;asdlf\n', '\n', ]

2.1.5 for循环遍历文件句柄(常用)

上面的四种都不太友好,因为如果文件较大,他们很容易撑爆内存
可以通过for循环去读取,文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存

f = open('../path1/弟子规',mode='r',encoding='utf-8')
for line in f:
    print(line)      #这种方式就是在一行一行的进行读取,它就执行了下边的功能

print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
# 注意:一定要通过文件句柄关闭文件

with  onen(f"aa".txt,mode="r",encoding="utf-8") as f:
	for line in f:
		print(line)
		
#此方法自动执行完后关闭文件,并且可以操作多个文件,产生多个文件句柄
with open('t1',encoding='utf-8') as f1,\
        open('Test', encoding='utf-8', mode = 'w') as f2:
    read=f1.readline()
    f2.write(read)

2.2 rb模式

rb:以二进制打开一个文件用于只读。文件指针将会放在文件的开头。带b的都是以二进制的格式操作文件,主要用于非文字文件(图片,音频,视频等),并且如果你要是带有b的模式操作文件,那么不用声明编码方式(不用加encoding)
rb模式也有read() read(n) readline() readline() for循环这几钟方法

3. 文件操作:写

这里也有四种模式:w,wb,w+,wb+ 。w+可以读写
w模式:
1.如果文件不存在,利用w模式操作文件,那么它会先创建文件然后写入内容
2.如果文件存在,利用w模式操作文件,就会先清空源文件,在写入新内容
wb模式:以二进制格式打开一个文件只用于写入

我先以rb的模式将一个图片的内容以bytes类型全部读取出来,然后在以wb将全部读取出来的数据写入一个新文件,这样我就完成了类似于一个图片复制的流程

with open('a1.jpg',mode='rb') as f,\
	    open('a2.jpg',mode='wb') as f1:
	    f2.write(f1.read())

4. 文件操作:追加

有四种模式:a,ab,a+,ab+
+是说明可以在原本的基础上加入可读的属性
a模式:
打开一个文件用于追加。如果该文件已存在,则文件至臻将会放在文件的结尾。如果文件不存在则重新创建后写入
ab就是以二进制的方式追加,a+就是可读的方式了以此类推

5. 文件的其他功能

5.1 read(n)

1.文件打开方式为文本模式时。代表读取n个字符
2.文件打开方式为b模式时,代表读取n个字节

5.2 seek()

seek(n)光标移动到n位置,注意:移动单位是byte,所有如果是utf-8的中文部分要是3的倍数,通常我们使用seek都是移动到开头或结尾
移动到开头:seek(0)
移动到结尾:seek(0,2),seek的第二个参数表示的是从哪个位置进行偏移,默认是0表示开头,1表示当前位置,2表示结尾

 = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()

5.3tell()

使用tell()可以帮助我们获取当前光标在什么位置

f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中⽂3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()

5.4 readable(),writeable()

判断是否可读,判断是否可写

f = open('Test',encoding='utf-8',mode='r')
print(f.readable())  # True
print(f.writable())  # False
content = f.read()
f.close()

6. 文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体模拟方式有两种实现方法:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

import os  # 调用系统模块

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('alex','SB') #在内存中完成修改

    write_f.write(data) #一次性写入新文件

os.remove('a.txt')  #删除原文件
os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跟着上帝去流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值