目录
一,文件介绍
1,什么是文件
狭义说:文本文件;
广义说:图片,声音,超链接,视频。
2,文件的分类
文件大体可以分为两类,文件文本和二进制文件
3,文件的作用
使用文件的目的是把一些数据存储起来
4,使用文件流程
(1)打开文件 open()
(2)读写文件 read() write()
(3)关闭文件 close()
二,读写文件简单操作
1、读取文件
file叫做文件句柄(变量)用来操作文件
第一个参数是文件的路径,
第二个 mode=访问文件的模型,r 表示读,默认也是 r 模式
file = open('file/a.txt', mode='r')
ret = file.read() # 将文件中的所有内容一次性读出来
print(ret)
# 最后关闭文件
file.close()
2,写文件
mode='w' 表示写文件
注意:如果文件不存在,会先自动创建文件(不会创建目录),然后在写内容
file = open('d.txt', mode='w')
file.write('aaaaa')
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
三,文件操作
读操作
read() | 默认把内容全部读取出来 还可以将制定个数的内容读取出来 |
readline() | 读一行\n 还可以将一行里面制定个数的内容读取出来 |
readlines() | 读多行, 将内容全部读取出来,并保存在一个列表中 |
for line in file: | 循环读取,文件句柄(文件对象)可以迭代 |
1, read()
file = open('d.txt', mode='r')
ret = file.read() # 将文件的全部内容读取出来
print(ret) # aaaaa
file.close()
file = open('d.txt', mode='r')
ret = file.read(3) # 读出文件的三个字符
print(ret) # aaa
file.close()
调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,会导致程序卡死,
所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
2,readline()
file = open('d.txt', mode='r')
ret = file.readline()
print(ret)
file.close()
#aaaaa
#
file = open('d.txt', mode='r')
ret = file.readline(3) # 将一行里面的指定个数的内容读取出来
print(ret)
file.close()
# aaa
3,readlines()
readlines,一次性以行的形式读取文件的所有内容并返回一个list,需要去遍历读出来
# readlines():读多行,把读出来的内容都保存在一个列表中
file = open('d.txt', mode='r')
ret = file.readlines()
print(ret) # ['aaaaa\n', 'bgfgfgfbf']
file.close()
4,循环读取:文件句柄(文件对象)可以迭代
# 循环读取,文件句柄(文件对象)可以迭代
file = open('d.txt', mode='r')
for line in file:
print(line)
file.close()
# aaaaa
#
# bgfgfgfbf
#
写操作
如果文件不存在,会自动创建文件,不会创建目录
write() | |
writelines() | 可以传递一个可迭代的内容 |
1,write()
先前没有c.txt ,这是自动生成并存储内容的
file = open('c.txt', mode='w')
file.write('wwwww')
file.close()
2,writelines()
# 可迭代内容选的是列表
file = open('f.txt', mode='w')
lst = ['aaa', 'bbb', 'ccc']
file.writelines(lst)
file.close()
# f.txt:aaabbbccc
# 要想让aaa bbb ccc换行的话,在列表里面加'\n'换行符即可
file = open('f.txt', mode='w')
lst = ['aaa\n', 'bbb\n', 'ccc']
file.writelines(lst)
file.close()
# aaa
# bbb
# ccc
四,文件权限
只读的操作
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()
# 新建一个文件 并存储csx
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,tell()
file = open('b.txt', mode='r')
ret = file.read(2) # 读两个 aa
print(ret)
print(file.tell()) # 获取光标的位置 2
ret = file.read() # 读出剩余的全部内容
print(ret)
file.close()
# a
# bbbccc
2,seek()
移动光标的位置
第一个参数 offset | 表示移几个位置 |
第二个参数 whence | 表示相对位置 0----->从开头 1------>从当前位置 2------>从末尾 |
aaa
bbbccc
#1.
file = open('b.txt', mode='r')
ret = file.read(3) # 读三个 aaa
print(ret)
file.seek(0, 2) # 把光标移动到末尾
ret = file.read() # 把剩余部分全部读出来
print(ret)
file.close()
#aaa
# 会是空,光标末尾没有内容
#2.
file = open('b.txt', mode='rb')
ret = file.read(3) # 读三个 aaa
print(ret)
file.seek(1, 1) # 把光标移动到当前位置,跳一个,再开始读
ret = file.read() # 把剩余部分全部读出来
print(ret)
file.close()
# b'aaa'
# b'\nbbbccc'
#3.
file = open('b.txt', mode='rb')
ret = file.read(3) # 读三个 aaa
print(ret)
file.seek(-3, 2) # 把光标移动到末尾,往回退三个,再开始读
ret = file.read() # 把剩余部分全部读出来
print(ret)
file.close()
# b'aaa'
# b'ccc'
注意:当mode='r'时,seek()的第一个参数必须为0,非0会报错
3,查看文件的名字和模式
file = open('b.txt', mode='r')
print(file.name) # b.txt
print(file.mode) # rb
file.close()
4,with 方式
这种方法会自动关闭文件,最后不用写file.close()
相当于:file=open('b.txt',mode='r)
with open('b.txt', mode='r') as f:
ret = f.read()
print(ret)
# aaa
# bbbccc
六,乱码问题
乱码问题是读写操作的编码不一致导致乱码
Python编码依赖于平台的编码 GBK
windows操作系统默认用GBK编码
with open('file/c.txt', mode='w',encoding='utf-8') as f:
f.write('你好,世界') # 指定用UTF-8编码
'''
乱码问题:
读写操作的编码不一致导致乱码
windows操作系统默认GBK
Python编码依赖于平台的编码 GBK
encoding= 可以指定编码方式 默认编码是GBK
'''
with open('file/c.txt', mode='r',encoding='utf-8') as f:
ret = f.read()
print(ret)