文件操作
方式一
f = open() # f: 学名:文件操作符 或 文件句柄 或者 文件操作对象
f = open('file','w',encoding= ‘utf-8’) #open打开文件是依赖了操作系统提供的途径 #操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码 #win系统 gbk mac、Linux系统 utf-8 mac, linux,打开python文件,默认utf-8,而python 3 默认是utf-8 所以用mac、Linux。系统的人 不用encoding='utf-8' win系统打开python文件,默认gbk,而python 3 默认是utf-8,所以需要encoding='utf-8'
例如:我们用pycharm 编写代码的时候,默认使用utf-8方式编写内容,所以要先把打开的文件转换成utf-8格式,保证打开
的文件类型变成utf-8,和你将要以哪种(utf-8)保持一致,才行
例子,一篇文章,如果全是英语 ,你再往里面输入英文 英译汉 可以直接变成汉语
一篇文章,如果全是英语,你再往里面输入日语, 英译汉 就会出错
***只要写入的类型和打开的类型一致,不管什么操作系统都不会出错
文件句柄的几个方法:
f.readable() #判断文件是否可读 f.writable() #判断文件是否可写 f.write('int') #write() 写入的date 全是str (打开文件的同时,文件被清空) write()如果文件不存在,那么不存在的文件会被创建 ---------- 找到文件: 绝对路径: 文件路径要用取消转译的方式来表示(两种方法): 1. \\ 2.r'path' 相对路径: 文件和py的 执行文件 在相同路径下,直接用文件的名字就可以 ---------------------- f.close() # 关闭文件 (操作系统级别的关闭) del f # 主动的释放了一个python程序内存中的变量 (解释器会主动回收,所以可写可不写(例如:定义a = 1,b = 2,程序后面不用,解释器会主动回收,不过回收是需要时间的)) ------------------- f.read() # 一次性读出文件的所有内容, r 是按字符读, rb 按字节读 f.read(n) # 一次读n个字符 f.readline() # 一次读一行,每次执行readline就会往下读一行 *** 不能直接读第二行 print()本身就带换行符,而文件每行末尾也有换行符,就会造成输出一行字符一行空,一行字符一行空。。。 print(1) ---------1\n print('1\n')------1\n\n 所以加.strip(),把每行末尾的换行符去掉 (strip 能去掉空格、制表符、换行符) content = f.readline() print(content.strip()) content = f.readline() print(content.strip()) f.readlines() # 返回一个列表,将文件中的每一行作为列表的一个元素 # readlines有一个问题,如果文件有10g ,你的电脑内存就爆了
定位光标写入位置:
tell() # 查看当前指针位置 seek(0) # 把指针定位到文件开头 seek(0,2) # 把指针定位到文件末尾 truncate(n) # 截取从开头到n个字符(0--n),n以后的全部删掉 **必须是写入模式 ‘r+’ ‘a’ ‘a+’ ‘w’ ‘w+’ 也就是除了'r'模式
一行一行的读取,几乎不占内存
for line i f: 一次拿一行到内存 释放掉上一行 print(line.strip())
例子:
有一个文件name:
apple 10 3
tesla 100000
mac 3000 2
lenovo 30000 3
chicken 10 3
phone 3 3000
f = open('name','r',encoding='utf-8') dic = {} shop_list = [] for i in f: if line.strip(): 有空行的话,line.strip()就是 '' 空,空的bool值就是False,不执行 dic1 = {'name':None,'price':None} li = i.split() dic1['name'] = li[0] dic1['price'] = li[1:] shop_list.append(dic1) print(shop_list) f.close()
读写参数:
w # 以写方式打开,如果这个文件不存在,则创建这个文件,存在会被覆盖 r # 以只读方式打开 x # 如果文件存在,打开会引发异常 a # 以写方式打开,写的内容追加在文章末尾(像列表的append()) b # 表示二进制文件 + # 以修改方式打开,支持读/写 r+ # 以读写模式打开 w+ # 以读写模式打开 (参见 w ) a+ # 以读写模式打开 (参见 a ) rb # 以二进制读模式打开 wb # 以二进制写模式打开 (参见 w ) ab # 以二进制追加模式打开 (参见 a ) rb+ # 以二进制读写模式打开 (参见 r+ ) wb+ # 以二进制读写模式打开 (参见 w+ ) ab+ # 以二进制读写模式打开 (参见 a+ )
示例: 文件的修改
name文件内容 aaaaaaa bbbbbbb cccccccc ------------------------------- f = open('name','r',encoding='utf-8') # 以 r 模式打开name文件 f1 = open('name1','w',encoding='utf-8') # 以 w 模式创建 name1 文件 for line in f: line = line.replace('a','x') # 把‘a' 替换成 x f1.write(line) # 把修改后的字符串写入name1 f.close() f1.close() # 关闭文件 import os # os模块 os.remove('name') # 删除name文件 os.rename('name1','name') # 把name1 文件改成原name文件 ---------------------------------- name文件修改后的内容 xxxxxxxx bbbbbbb xxxxxxxx 文件不能直接修改,可以把修改的内容存在另一个文件,把原文件删除,然后另一个文件改名字,间接完成修改
方式二
with语法,上下文管理
优点是不用手动关闭,且读取文件的过程中,不管是否发生错误,都会自动关闭文件
示例:
with 可以不用关闭文件 name文件 xxxxxxxx bbbbbbb xxxxxxxx ------------------------------------- with open('name','r',encoding='utf-8') as f,\ open('name1','w',encoding='utf-8') as f1: for line in f: line = line.replace('x','a') f1.write(line) import os os.remove('name') os.rename('name1','name') --------------------------------------- name文件 aaaaaaa bbbbbbb cccccccc