目录
一、文件介绍
1.什么是文件
狭义说:文本文件;
广义说:超文本文件, 图片,声音,超链接,视频。
2.文件的分类
文件大体上可以分为两类,文本文件和二进制文件。
3.文件的作用
使用文件的目的是把一些数据存储存放起来。
4.使用文件的流程
我们操作一个文件的流程一般是 打开文件,读写文件,关闭文件。通过程序操作文件的流程也是这三步,首先打开文件,然后读写文件,最后关闭文件。
二、读写文件简单操作
1.读取文件
file叫做文件句柄(变量)用来操作文件
第一个参数是文件的路径,
第二个参数 mode=访问文件的模型,r 表示读,默认也是r 模式
file=open('file/a.txt',mode='r',encoding='UTF-8')
ret=file.read()#将文件中的所有内容一次性读取出来
print(ret)
#最后关闭文件
file.close()
2.写文件
mode='w' 表示写文件
注意:如果文件不存在,会先自动创建文件(不会创建目录),然后再写内容
file=open('file/d.txt',mode='w')
file.write('azy')
file.close()
3.文件拷贝
file1=open('file/a.txt',mode='r')
file2=open('file/c.txt',mode='w')
ret=file1.read()
file2.write(ret)
file1.close()
file2.close()
c.txt拷贝的a.txt
三、文件权限
读操作
1.r
以只读方式打开文件。
文件的指针将会放在文件的开头。
这是默认模式。
file=open('file/a.txt',mode='r',encoding='UTF-8')
ret=file.read()#将文件中的所有内容一次性读取出来
print(ret)
#最后关闭文件
file.close()
2.rb
以二进制格式打开一个文件用于只读。
文件指针将会放在文件的开头。
一般用于非文本文件如图片等。
file=open('file/Koala.jpg',mode='rb')
ret=file.read()
print(ret)
file.close()
3.r+
打开一个文件用于读写。
文件指针将会放在文件的开头。
先读后写
file=open('file/c.txt',mode='r+')
#先读
ret=file.read()
print(ret)
#后写
file.write('mmmmmm')
file.close()
先写后读
file=open('file/a.txt',mode='r+')
#先写
file.write('llllll')
#后读
ret=file.read()
print(ret)
file.close()
读的内容
如果文件不存在,不会自动创建
file=open('file/e.txt',mode='r+')
file.close()
写操作
1.w
打开一个文件只用于写入。
如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。
如果该文件不存在,创建新文件。
file=open('file/b.txt',mode='w')
file.write('csx')
file.close()
2.wb
以二进制格式打开一个文件只用于写入。
如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。
如果该文件不存在,创建新文件。
一般用于非文本文件如图片等。
file1=open('file/Koala.jpg',mode='rb')
file2=open('file/Koala2.jpg',mode='wb')
ret=file1.read()
file2.write(ret)
file1.close()
file2.close()
3.w+
打开一个文件用于读写。
如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。
如果该文件不存在,创建新文件。
file=open('file/a.txt',mode='w+')
# #先写
file.write('llllllmm')#将原文件中的内容删除重新写
ret=file.tell()
print(ret)
# #后读
file.seek(0,0)
ret1=file.read()#什么都没有
print(ret1)
file.close()
4.a
打开一个文件用于追加
文件已存在
如果该文件已存在,文件指针将会放在文件的结尾。
也就是说,新的内容将会被写入到已有内容之后。
file=open('file/a.txt',mode='a')
file.write('\nazy lmm')
#ret=file.read() 不能读,会报错
#print(ret)
file.close()
文件不存在
如果该文件不存在,创建新文件进行写入。
file=open('file/b.txt',mode='a')
file.write('\nazy lmm')
#ret=file.read() 不能读,会报错
#print(ret)
file.close()
注意:都不可进行读操作
5.a+
打开一个文件用于读写
文件已存在
如果该文件已存在,文件指针将会放在文件的结尾。
文件打开时会是追加模式。
先写后读
file=open('file/a.txt',mode='a+')
file.write('\nazy lmm')#追加完后光标停在末尾
t=file.tell()
print(t)
#后读
ret=file.read()
print(ret) #什么都读不到
file.close()
先读后写
#先读
file=open('file/b.txt',mode='a+')
ret=file.read() #什么都读不到,因为光标在内容的末尾
print(ret)
#后写
file.write('happy')
file.close()
文件不存在
如果该文件不存在,创建新文件用于读写,读写方式同文件存在时一样。
四、文件操作
读操作
1.read()
调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,会导致程序卡死,
所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
2.readline()
readline每次读取一行,并且自带换行功能 ,每一行末尾会读到\n
file=open('file/a.txt',mode='r',encoding='UTF-8')
ret=file.readline()
print(ret)
file.close()
3.readlines()
readlines,一次性以行的形式读取文件的所有内容并返回一个list,需要去遍历读出来
4.循环读取
file句柄是一个可迭代的对象因此,可以循环读取文件中的内容,每次读一行
写操作
1.write()
file=open('file/b.txt',mode='w')
file.write('happy')
file.write('birthday')
file.close()
2.writelines()
格式:file.writelines(seq)
#把seq的内容全部写到文件中(多行一次性写入)
file=open('file/b.txt',mode='w')
lst=['aa\n','bb','cc']
file.writelines(lst)
file.close()
其他操作
1.tell()
tell获取文件当中当前光标所在的位置
2.seek()
seek移动光标位置
seek(offset,whence)
参数:
offset 移动的长度(字节)
whence 相对位置 0从开头(默认),1从当前,2从末尾
file=open('file/b.txt',mode='r')
ret=file.read(3)
print(ret)
ret2=file.tell()
print(ret2)
#1光标从当前位置
file.seek(0,1)
print(file.read(3))
#0光标从开始位置
file.seek(0,0)
print(file.read(3))
#2光标从末尾开始
file.seek(0,2)
print(file.read(3))
#r,r+不支持offset为非零数字
# file.seek(-1,2)
# print(file.read())
file.close()
3.name()和mode()
file.name 返回 路径
file.mode 返回 文件读写模式
file=open('file/b.txt',mode='r')
print(file.name)
print(file.mode)
file.close()
五、with
使用with方式操作文件,自动关闭文件,不需要file.close()
with open('file/b.txt',mode='r') as f:
ret=f.read()
print(ret)
六、乱码
python读写文件时,默认使用的编码为平台编码,也就是gbk。
在pycharm中创建的文件默认使用的是utf-8编码。
1.往pycharm中的k.txt中保存内容会乱码
with open('file/a.txt', mode='w') as f:
f.write('哈哈哈哈哈哈')
解决办法:
2.向磁盘中的文件保存内容,不乱码
with open('e:/a.txt', mode='w') as f:
f.write('哈哈哈哈哈哈')