Python学习笔记-Day8
内容大纲:
一、文件操作初识
二、文件的读、写、追加
三、文件的改
四、文件读取的五种方法
五、文件的操作方法
六、主动关闭句柄
一、文件操作初识
打开一个文件需要知道的内容有:
文件路径:c:\文件.txt(绝对路径和相对路径)
编码方式:utf-8、gbk、GB2312…
操作方式:只读、只写、写读、读写、追加等
f = open('文件路径', '编码方式', '操作方式')
例如:这是一个文件读取的代码
f = open('c:\python\文件.txt',encoding='utf-8',mode='r') content = f.read() print(content) f.close()
其中:
f:文件句柄,可以是f_obj、f_handler、f_h、fh
open:python的内置函数(内部调用的是windows的系统命令)
打开文件时的报错原因:
1、UnicodeDecodeError:编码不一致,存储文件编码与打开文件时的编码方式不同
2、FileNotFoundError:路径问题(文件名错误)
解决方式:
①在路径前加上 r:r'c:\python\文件.txt'
②将每个\变成 \\
绝对路径:根目录开始找
相对路径:当前文件夹开始找
二、文件的读、写、追加
1、、文件的读:
r *****
rb ***
r+ *****
r+b
(1) r:对于r模式,mode可以不写
f=open('c:\python\文件',encoding='utf-8',mode='r') content=f.read() print(content) f.close()
(2) rb:文件以字节(8bit,16进制)进行读取。不需要编码方式。主要用于非文字类的文件读取。
f=open('c:\python\图片.jpg',mode='rb') print(f.read()) f.close 输出结果是:b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x0…….
(3) r+:读写,先读后追加。
①先读后写:在文件后追加上写的内容
path='c:\python\文件.txt' f=open(path,encoding='utf-8',mode='r+') content=f.read() #先读 print(content) f.write('天安门') #后追加 f.close()
②不读直接写:写的内容会从文件开始覆盖原文件(按照每个不同字符的字节的大小)
path='c:\python\文件.txt' f=open(path,encoding='utf-8',mode='r+') f.write('天安门') f.close()
(4)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
(1)w:没有文件,创建文件也要写;有文件,文件先清空,后写入
f=open('文件',encoding='utf-8',mode='w') #在相对路径下先创建这个文件 f.write('你好,我是某某某') f.close()
(2)w+:写读,先写后读,但是此时光标已经移至最后,读出的内容可能只有一个换行符。但是可以通过改变光标位置进行读操作
f=open('文件',encoding='utf-8',mode='w+') f.write('123456') print(f.read()) #读不出来
f=open('文件',encoding='utf-8',mode='w+') f.write('123456') f.seek(2) print(f.read()) #改变了光标的位置,可以读出东西来
(3)wb:以字节形式写入
f=open('文件',mode='wb') f.write(b'\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8')
(4)wb+:以字节方式写入加读取
3、文件的追加
a
ab
a+
a+b
(1)a:没有文件,创建文件也要写;有文件,在文件后面追加
f=open('文件追加',encoding='utf-8',mode='a') f.seek(1) #不管光标在哪里,都是在最后追加 f.write('123')
三、文件的改
文件的改(需要用到python的内置函数 os)
1、以读的模式打开原文件,产生一个文件句柄f1;
2、以写的模式创建一个新的文件,产生一个文件句柄f2;
3、读取原文件的内容,进行修改,并将修改后的写入到新文件中;
4、将原文件删除;
5、将新文件重新命名为原文件
方法一、
import os with open('文件',encoding='utf-8',mode='r')asf1,\ open('文件的改',encoding='utf-8',mode='w')asf2: old_content=f1.read() new_content=old_content.replace('天安门','beiji') f2.write(new_content) os.remove('文件') os.rename('文件的改','文件')
方法二、
import os with open('文件1',encoding='utf-8',mode='r')asf1,\ open('文件的改1',encoding='utf-8',mode='w')asf2: forlineinf1: new_line=line.replace('qwer','asv') f2.write(new_line) os.remove('文件1') os.rename('文件的改1','文件1')
四、文件读取的五种方式
1、read():全部读取,对于较大的文件,内存会负担不起
2、read(n):r模式下按照字符读取;rb模式下按照字符的bytes模式读取
3、readline():按行读取,但是中间会有个换行符,这是因为每行文件末尾默认都有一个换行符
path='c:\python\文件.txt' f=open(path,encoding='utf-8',mode='r') print(f.readline()) print(f.readline()) print(f.readline()) f.close()
4、readlines():按行读取,返回一个列表,列表中的每个元素就是每一行的字符串
path='c:\python\文件.txt' f=open(path,encoding='utf-8',mode='r') print(f.readlines()) f.close()
输出结果是:['123456\n', '你好吗,中国\n', '中国,你好码\n', '深圳\n', '广州\n', '中国\n', '北京\n']
5、for循环:逐行输出
path='c:\python\文件.txt' f=open(path,encoding='utf-8',mode='r') for line in f: print(line.strip()) f.close() 输出结果是: 123456 你好吗,中国 中国,你好码 深圳 广州 中国 北京
五、文件的常用操作方法
read():文件的读操作
write():文件的写操作
close():文件关闭
seek():移动光标位置,在进行w+或者a+的时候可以通过移动光标的位置进行读取,光标是按照字节来移动
seek(0,2):将光标移到最后一位
tell():返回光标的位置
readable():判断是否可读
writable():判断是否可写
truncate():在writable模式下进行截取,r+、a+,不能在w模式下使用,对原文件进行截取。按照字符截取
f=open('文件',mode='r+') print(f.truncate(6))#截取文件后6个字符 f.close()
六、主动关闭文件句柄的方法
有的时候会忘记在末尾加上f.close()
所以有主动关闭文件句柄的方法,这种方法会在一定时间内关闭,有利有弊
1、主动关闭文件句柄
with open('文件',encoding='utf-8',mode='r') as f1: print(f1.read())
2、可以同时开启多个文件句柄
with open('文件',encoding='utf-8',mode='r') as f1,\ open('文件1',encoding='utf-8',mode='w') as f2: print(f1.read()) f2.write('qwert')