在python中我们经常会对文件进行一些常见的操作,比如打开文件,操作文件,关闭文件,此篇文章主要是记录自己在学习过程中的一些总结供大家学习,也欢迎查漏补缺~
1.文件的打开
方式一:此种方式打开的文件需要手动将文件进行关闭
f1 = open(r'xxx', mode='r', encoding='utf-8') content = f1.read() print(content) f1.close()
f = open('文件路径', '编码方式', '操作方式')
文件路径:可以是相对路径,也可以是绝对路径
路径的三种写法:
\\ file = open(‘C:\Users\chy\Desktop\Python\xxx.txt’) r'\' file = open(r’C:\Users\chy\Desktop\Python\xxx.txt’) '/'(推荐) file = open(‘C:/Users/chris/chy/Python/xxx.txt’)
编码方式:可以不填写,默认是当前操作系统的编码,linux下默认是utf-8
操作方式:只读(r),只写(w),写读,读写,追加等;如果是不写的话默认是只读模式r
方法二:使用with语句进行打开文件(推荐使用此种方法)
with open(r'xxxx.txt', mode='r', encoding='utf-8') as f1: content = f1.read() print(content)
优点1:不用手动关闭文件
with open('xxxxx', encoding='utf-8') as f1: print(f1.read())
优点2:一个with语句可以操作多个文件
with open('xxx1', encoding='utf-8') as f1, \ open('xxxx2', encoding='utf-8', mode='w') as f2: print(f1.read()) f2.write('ccccc')
2.文件的操作
(1)文件的读r,rb,r+,r+b
r:只读模式,文件必须存在,不存在就会有异常
rb:对于非文本文件,我们只能使用b模式。注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
f=open('c:\图片.jpg',mode='rb') print(f.read()) f.close 输出结果是:b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x0…….
r+:读写,先读写然后追加,一定要先读后写,否则会出现读取不到内容
#错误用法 f = open('log1.txt',encoding='utf-8',mode='r+') f.write('345') #先写,会将原来的内容给覆盖,然后文件指针放在文件最后 content = f.read() #因为现在指针在文件最后导致读取的时候从最后一个位置进行读写就不会读出任何内容 print(content) #输出的是空 f.close() #改进 f = open('log1.txt',encoding='utf-8',mode='r+') f.write('345') #先写,会将原来的内容给覆盖,然后文件指针放在文件最后 f.seek(0) #会将文件指针给恢复到文件最开始 content = f.read() #因为内容被覆盖了此时,读取到的内容是覆盖后的 print(content) #输出的是345 f.close()
r+b:文件以字节形式进行先读后以字节形式写,没有encoding。
path='c:\python\文件.txt' f=open(path,mode='r+b') print(f.read()) f.write(b'\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8')
(2) 文件的写:w,wb,w+,w+b
w:没有文件,创建文件;有文件,文件先清空,后写入
#写法1 f=open('xxx.txt',mode='w',encoding='utf-8') #在相对路径下先创建这个文件 f.write('测试w模式的用法') f.close #写法二: with open('xxx.txt',mode='w',encoding='utf-8') as f1: content=f1.write('测试w模式的用法') print(content)
wb:以bytes写入,写入的内容,必须要转换为bytes类型才可以
#写入的内容直接是byte模式 with open('xxx','wb') as f1: f1.write(b'\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8') f1.seek(0) #因为写入之后,光标会在最后一个指针所以需要将指针进行回退到文件的最开始 content=f1.read() print(content) #写入的不是byte内容,所以需要先转换成byte模式 with open('xxx','wb') as f1: f1.write('人生苦短,我想学Python'.encode(encoding="utf-8"))#str.encode()这个是函数转换 content=f1.read() print(content)
w+:写读,先写后读,但是此时光标已经移至最后,读出的内容可能只有一个换行符。但是可以通过改变光标位置进行读操作
with open('xxxx',mode='w+',encoding='utf-8') as f1: f1.write('ccc') print(f1.tell()) #tell()这个函数是输出指针当前的位置 f1.seek(0) #seek()这个函数是调整光标的位置,0代表将光标位置调整到句首 content=f1.read() print(content)
(3)文件的追加:a,ab,a+,a+b
a:没有文件,创建文件追加,有文件,在文件后面追加,不支持读
with open('xxx',mode='a',encoding='utf-8') as f1:
f1.seek(0) #不管光标在哪里,都是在最后追加
f1.write('adb')
3.文件的读取方式
(1)全部读取出来 f.read()。全部读取,对于较大的文件,内存会负担不起
with open('xxx.txt',encoding='utf-8') as f1: content = f1.read() print(content)
(2) 读取一部分f.read(n)。在r模式下,read(n) 按照字符去读取。rb模式下按照字符的bytes模式读取
with open('xxx.txt',encoding='utf-8') as f1: content=f1.read(3) #代表从当前指针往后读取3个字符 printcontent)
(3) 一行一行的读 f.readline()。按行读取,但是中间会有个换行符,这是因为每行文件末尾默认都有一个换行符
with open('xxxx',encoding='utf-8') as f1: f1.readline() #读取完成以后此时指针会在第一行的末尾有个换行符 f1.readlind() #读取第二行,第一行跟第二行之间有个换行符
(4) f.readlines() 按行读取,返回一个列表,列表中的每个元素就是每一行的字符串
with open('xxxx',encoding='utf-8') as f1: print(f1.readlins()) #返回的结果['11111111111111\n', '222222222222\n', '33333333333\n', '444444444abc']
(5) for循环读取,在for循环中,每次读取一行,结束之后,内存就释放了。所以在整个for循环个过程中,始终只占用了一行内容的内存。推荐使用
with open('python1.txt',encoding='utf-8') as f1: for line in f1: print(line.strip())
4.文件的常用操作方法
(1)f.seek():改变当前文件指针的位置,注意,移动的单位是byte(字节),所以如果是UTF-8的中文部分要3的倍数,意思就是一个字要三个字节
f.seek(offset,from_what)
- from_what的值,从哪个位置进行偏移,如果是0表示开头,如果是1表示当前位置,2表示文件的结尾。默认为0,即文件开头
- seek(x,0):从文件首行首字符开始移动x个字符
- seek(x,1):从当前为往后移动x个字符
- seek(-x,2):从文件的结尾往前移动x个字符
(2)f.tell():使用tell()可以帮我们获取到当前光标在什么位置
with open("E:\PyCharm\\test.txt",mode ="r+",encoding = "utf-8") as f1:
f1.seek(0) # 光标移动到开头
f1.write("中国人") # 写入信息,此时光标在9,因为中文3个字节代表一个字符3*3=9
print(f1.tell()) # 此时获取光标所在的位置,中文一个字三个光标为一个字,因为中文3个字节代表一个字符
f1.flush() # 刷新