简介
引子
现在这个世界上,如果可以操作文件的所有软件都消失了,比如word,wps等等,此时你的朋友通过qq给你发过来一个文件,文件名是:美女模特空姐护士联系方式.txt,在座的所有男同学,那么你接受到这个文件之后,你的内心是否有一丝冲动,当然咱们不是那种闷骚的人,其实我们就是比较好奇,就是想要看看里面写的是什么,仅此而已,绝不联系。但是我说了所有可以操作文件的软件全部都没了,那么你是不是百爪挠心,火急火燎,哎呀。别急呀,你忘了么?你学过Python这门编程语言,这个语言肯定有能操控文件的功能。我相信在这种强大的动力下,你是可以,必须能学会的。
-
编码方式
utf-8,gbk,gb2312.... (昨天刚讲完编码,文件其实就是数据的存储,数据存储你需要编码知道这个数据是以什么编码存储的)
-
操作模式
只读,只写,追加,写读,读写....
1 文件的读
- read()
读取全部
file = open('D:内容.txt',encoding='utf-8',mode='r')
print(file.read())
file.close()
'''
open内置函数,open底层调用的是操作系统接口。
f1,变量 f1 fh file f_h 文件句柄
'''
- read(n)
指定字符个数进行读
file = open('D:内容.txt',encoding='utf-8',mode='r')
print(file.read())
file.close(1)
>>>
详
- readline()
按行读
file = open('D:内容.txt',encoding='utf-8',mode='r')
print(file.readline()
file.close(1)
- readlines()
readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。
f = open('log',encoding='utf-8')
print(f.readlines())
f.close()
# 结果['666666
', 'fkja l;
', 'fdkslfaj
', 'dfsflj
', 'df;asdlf
', '
', ]
- 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()
- rb读取图片(bytes)
rb模式:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。记住下面讲的也是一样,带b的都是以二进制的格式操作文件,他们主要是操作非文字文件:图片,音频,视频等,并且如果你要是带有b的模式操作文件,那么不用声明编码方式。
file = open('D:美女.jpg',mode='rb')
img = file.read()
file.close()
f1 = open('美女.jpg',mode='wb')
f1.write(img)
f1.close()
>>>
会创建一个名字为美女.jpg图片
2 文件的写
- wb模式
wb模式:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如:图片,音频,视频等。
file = open('D:美女.jpg',mode='rb')
img = file.read()
file.close()
f1 = open('美女.jpg',mode='wb')
f1.write(img)
f1.close()
>>>
会创建一个名字为美女.jpg图片
- w模式
如果文件不存在,利用w模式操作文件,那么它会先创建文件,然后写入内容.
f1 = open('文件.txt',encoding='utf-8',mode='w') #没有会在当前目录下创建一个这样文件,有责覆盖里的内容
print(f1.write("Hello python"))
f1.close()
- a追加模式
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
如果文件不存在,利用a模式操作文件,那么它会先创建文件,然后写入内容。
f1 = open('文件.txt',encoding='utf-8',mode='a')
print(f1.write("
Hello python"))
f1.close()
- r+读写模式
打开一个文件用于读写。文件指针默认将会放在文件的开头。
如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。
f1 = open('文件.txt',encoding='utf-8',mode='r+')
print(f1.read())
print(f1.write("
Hello python"))
f1.close()
3 文件的另一种打开方式
# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
with open('t1',encoding='utf-8') as f1:
f1.read()
# 2,一个with 语句可以操作多个文件,产生多个文件句柄。
with open('t1',encoding='utf-8') as f1,
open('Test', encoding='utf-8', mode = 'w') as f2:
f1.read()
f2.write('老男孩老男孩')
4 文件的修改
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(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')