day7笔记
python文件操作
打开文件的方式: r 只读 r是默认的只读模式 读的是文字 f = open('t.txt',mode='r',encoding='utf-8') #f = open(文件路径+模式+编码集) 1. ff = f.read() 读出文件全部内容, 默认从文件头开始读 缺点文件很大的话会占内存 f1 = f.read(3) ()里面写3就表示读前3个内容 f2 = f.read() 执行f1操作后会继续往后读,而不会从头开始读了 f.close() #关闭文件 注意点:读完的文件句柄一定要关闭 2. ff1 = f.readline() # 一行一行的读 注意点:readline()读取出来的数据在后面都有一个\n f = open('liu.txt',mode='r',encoding='utf-8') msg1 = f.readline().strip() #因为读出来有回车,所以用stirp取掉换行符'\n' msg2 = f.readline().strip() msg3 = f.readline().strip() msg4 = f.readline().strip() f.close() print(msg1) #读出来内容就是 春眠不觉晓 print(msg2) 处处闻啼鸟 print(msg3) 夜来风雨声 print(msg4) 花落知多少 3. 如果有较大的文件不推荐使用 f.read() 会引起内存崩溃 推荐使用 for line in f: print(line) #这种方式就是一行一行的读,类似于ff=f.readline() 4.rb 读出来的数据是bytes类型,在rb模式下,不能encoding字符集 rb的作用:在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的 在后面我们文件上传下载的时候还会用到. f = open('path1/小娃娃.txt',mode='rb') 使用b的时候不能加编码集 b是操作字节的 msg = f.read(3) # 括号里 3 就是utf-8前三个字节,这3个字节就代表中文1个字,只能输出3,6,9,12...随便输4,5会在utf-8解码错误 msg1 = f.read() 继续往后读得到后面所有的字节 f.close() print(msg) print(msg1) 结果: b'\xe9\xab\x98' b'\xe5\x9c\x86\xe5\x9c\x86\r\n\xe5\x88\x98\xe4\xba\xa6\xe8\x8f\xb2' 5. 总结: 只读 r 正常文本 只读 rb 字节 read() 默认全读完 可以指定读几个 readline() 一行一行读 w 写: 1.覆盖写,用"w"模式打开的时候默认情况文件内容,再写 ***在写文件的时候我们要养成一个写完文件就刷新的习惯. 刷新flush()*** f = open('../path1/小娃娃.txt',mode='w',encoding='utf-8') f.write('太白很白')<br>f.flush() # 清空原文件然后写入 太白很白 f.close() 2.如果文件不存在就会创建文件再写入,所以'w'模式可以创建文件再写入 3.wb模式下,不可以指定打开文件的编辑,但是写文件的时候必须将字符串转换成utf-8的bytes数据 f = open('../path1/小娃娃.txt',mode='wb') msg = '你好'.encode('utf-8') #将你好转换成bytes才能写入 f.write(msg) f.flush() # 刷新 f.close() 3. 总结: w只能覆盖的写 w模式会自动创建文件 w模式下写的时候首先清空文件的内容,然后在写 a 追加 1.只要是a或者ab,a+都是在文件的末尾写入,不论光标在任何位置. 在追加模式下,我们写入的内容后追加在文件的末尾 f = open('liu.txt',mode='a',encoding='utf-8') f.write('python的魅力') #写在'liu.txt'文件内容的后面 f.close() 2. 总结 a 追加 在文件文本末尾添加内容. 路径: 相对路径:用一个文件夹下的文件,相对于当前这个 程序 所在的文件而言. 如果在同一个文件中,则相对路劲就是这个文件名. f.open('..day6/liu.txt',mode='ab') # '..day6/liu.txt'这就是个相对路径 用斜杠隔开 # .. 返回上一级 绝对路径:就是根目录开始一直到文件名. f.open('E:\s17\day7\liu.txt',mode='w',encoding='utf-8') #'E:\s17\day7\liu.txt' 这就是个根目录,从磁盘一直到文件名称. 用反斜杠隔开 转义 'E:\\s17\\day07\\文件夹\\s.txt' r'E:\s17\day07\文件夹\s.txt' 绝对路径 *******推荐使用相对路径,以后工作都使用相对路径*********** r+ 读写 r+ 是咱们最常用的 必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+ f = open('liu.txt',mode = 'r+',encoding='utf-8') f1 = f.read() #先读到文件的内容 f.write('python 的魅力') #再覆盖写入 f.flush() f.close() #最后输出写出的内容 **************深坑请注意: 在r+模式下. 如果读取的内容. 不论读取内容多少. 光标显示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作. w+ 写读 不常用 先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的(为啥呢,因为读的时候光标在新写入内容的后面,所以读不到),不常用 f = open('liu.txt',mode = 'r+',encoding='utf-8') f.write('python 的魅力') #先将文件内容清空写入 f1 = f.read() # 光标在python 的魅力的后面,读到的内容都是空的 所以读不到 f.flush() f.close() print(f1) #最后输出空的的内容 a+ 追加读写 a+模式下,不论是先读还是后读,都是读不到数据的 f = open('liu.txt',mode = 'a+',encoding='utf-8') f.write('python 的魅力') # 先将文件内容清空写入 f1 = f.read() # 光标始终在python 的魅力的后面,读到的内容都是空的 所以读不到 f.flush() f.close() print(f1) 其他操作: 1.seek() seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数 通常我们使用seek都是移动到开头或者结尾 seek(0) #将光标调整到开头 单个参数是字节数 0除外 0就是表示调整光标到开头 seek(0,1) #将光标调整到当前位置 seek(0,2) #将光标调整到末尾位置 f = open('liu.txt',mode='w+',encoding='utf-8') f.write('独坐敬亭山') f.flush() f.seek(3) #表示将光标以字节数进行前移 msg = f.read() f.close() print(msg) #获取到 做敬亭山 2.tell() 获取当前光标的位置 f = open('文件夹/s.txt',mode='w',encoding='utf-8') ss = f.tell() # 按字节算 #查看光标位置 print(ss) 3.truncate() 截断文件 所以如果想做截断操作. 记住要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断 关于truncate(n), 如果给出n. 则从开头进行截断, 如果不给n, 则从当前位置截断. 后面 的内容将会被删除 f = open('liu.txt',mode='w',encoding='utf-8') f.write('独坐敬亭山') #写入5个字符 f.seek(3) #将光标移动到3,也就是独和坐之间 f.truncate(3) # 删掉光标后面的内容 f.close() 4.文件修改(偷天换日) with open('liu.txt',mode='r',encoding='utf-8')as f: 与 f = open('liu.txt',mode='w',encoding='utf-8') 写法一样 with open('liu',mode='r',encoding='utf-8')as f,\ open('fei.txt',mode='w',encoding='utf-8')as f1: # 打开两个文件夹 ff = f.read() # liu ff2 = ff.replace('我','都') #修改 引用替换将 ff文件里面的 我 全部改成 都 f1.write(ff2) # fei.txt 修改后的内容 for i in f: ret = i.replace('都','大家') f1.write(ret) import os os.remove('liu.txt') os.rename('fei.txt','liu.txt') # 第一个参数是重命名的文件,第二个参数是源文件.