day9 文件的读取
文件操作
一、打开文件
f = open('歌词.txt','w',encoding='utf-8') # f:文件操作符 文件句柄 文件操作对象
open打开文件是依赖了操作系统提供的途径
操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码
win默认编码gbk mac/linux默认utf-8
习惯叫f file f_obj f_handler fh
操作:读 写
f = open('歌词.txt','w',encoding='utf-8') print(f.writable()) # True writable判断文件是否可写 print(f.readable()) # False readable判断文件是否可读 f.write('7000') # 写文件的时候需要写数字,需要把数字转换成字符串 f.write('wodexintailuan') f.write('yaoyidiankongbai\n') f.write('laotianzaibuzai') f.write('\nlaotianzaibuzai') # 文件的换行 f.write('志强') f.close() # 关闭文件
二、找到文件详解
找到文件详解:文件与python的执行文件在相同路径下,直接用文件的名字就可以打开文件
文件与python的执行文件不在相同路径下,用绝对路径找到文件
文件的路径,需要用取消转译的方式来表示:1.\\2.r''
如果以写文件的方式打开一个文件,那么不存在的文件会被创建,存在的文件之前的内容会被清空
f = open(r'C:\Users\Administrator\Desktop\s8.txt','w',encoding = 'utf-8') # r取消后面字符串所有的特殊功能 f.write('哈哈哈') f.close()
三、关闭文件详解
操作系统级别的关闭文件资源:f.close() 必须写
del f 主动释放了python程序内存中的变量 可写可不写
四、读模式
# f = open('歌词.txt','r',encoding = 'utf-8') f = open('歌词.txt',encoding = 'utf-8') # 默认为r模式 # 读文件的第一种方式:read方法,用read方法会一次性的读出文件中的所有内容 print(f.read()) # 读一部分内容:read(n),指定读n个单位 print(f.read(5)) # 读文件的第三种方式:按照行读,每次执行readline就会往下读一行 content = f.readline() print(content.strip()) # strip去掉空格、制表符、换行符 content2 = f.readline() print(content2.strip()) # 读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表 content = f.readlines() print(content) # 读:最常用 for line in f: print(line.strip())
五、读文件并整理成需要的数据类型
读文件并整理成需要的数据类型 {'apple':[10,3]} f = open('shoplist',encoding='utf-8') goods_dict = {} for line in f: line = line.strip() goods_list = line.split() goods_dict[goods_list[0]] = goods_list[1:] print(goods_dict) f.close() f = open('shoplist',encoding='utf-8') goods_list = [] for line in f: goods_dict = {} line = line.strip() goods_lst = line.split() goods_dict['name'] = goods_lst[0] goods_dict['price'] = goods_lst[1] goods_list.append(goods_dict) print(goods_list) f.close() # 只显示文件中有内容的行 f = open('shoplist',encoding='utf-8') goods_dict = {} for line in f: if line.strip(): print(line.strip()) f.close()
六、文件的打开模式
f = open('歌词.txt','rb') content = f.read() print(content) f.close() # b:图片、音乐、视频等任何文件 # 传输:上传、下载 # a追加 f = open('shoplist','a',encoding='utf-8') f.write('\ncomputer 6000 5') f.close() # r+ 可读可写 # 先读后写:写是追写 # 先写后读:从头开始写,并且会依次覆盖内容 f = open('歌词.txt','r+',encoding='utf-8') line = f.readline() print(line) f.write('000000') f.close() # w+ 可写可读 # 一上来文件就清空了,尽管可读 1.但是读出来的内容是你这次打开文件新写入的2.光标在最后,需要主动移动光标才可读 f = open('歌词.txt','w+',encoding='utf-8') f.write('abc\n') f.write('哈哈哈') f.seek(0) print(f.read()) f.close() # a+ 追加可读 f = open('歌词.txt','a+',encoding='utf-8') f.write('\nqq星') f.seek(0) print(f.read()) f.close() # 一般情况下:文件操作要么读,要么写,很少会用到读写、写读同时用 # 常用的: # r、w、a # rb、wb、ab,不需要指定编码了
七、文件内的光标移动
read(3)
文件打开方式为文本模式时,代表读取3个字符
文件打开方式为b模式时,代表读取3个字节
f = open('歌词.txt','r+',encoding='utf-8') # seek光标移动到第几个字节的位置 f.seek(0) # 光标移动到开头 f.seek(0,2) # 光标移动到最后 f.seek(0,1) # 以当前位置为基准移动 tell告诉我光标在第几个字节 truncate 从文件开始的位置只保留指定字节的内容 f.truncate(3)
八、文件的修改
# 1.创建一个新的文件 f2 = open('原文件.bak','w',encoding='utf-8') # 2.把原来的文件中的内容读出来 f = open('原文件',encoding='utf-8') old_content = f.read() # 原来的内容 # 3.操作读出来的字符串,把字符串中的内容替换掉 new_content = old_content.replace('原来','新') # 4.把替换之后的内容写到新文件里 f2.write(new_content) f.close() f2.close() # 5.删除原文件,新文件重命名成源文件的名字 import os # os模块 os.remove('原文件') # 删除文件 os.rename('原文件.bak','原文件') # 重命名 # 只替换第一个原来 f2 = open('原文件.bak','w',encoding='utf-8') f = open('原文件',encoding='uft-8') count = 0 for line in f: if '原来' in line and count == 0: new_line = line.replace('原来','新') f2.write(new_line) count = 1 else: f2.write(line) f.close() f2.close() import os # os模块 os.remove('原文件') # 删除文件 os.rename('原文件.bak','原文件') # 重命名
九、with操作文件,不用关闭文件
with open('源文件',encoding='utf-8') as f: content = f.read() print(content) with open('源文件',encoding='utf-8') as f,open('源文件.bak','w',encoding='utf-8') as f2: for line in f: new_line = line.replace('原来','新') f2.write(new_line)