1,文件操作
参数:1,文件路径 2,编码方式,3,执行动作(打开方式),只读,只写,,读写,追加和读写。
1 打开文件,得到文件句柄并赋值给一个变量。2. 通过句柄对文件进行操作。3. 关闭文件。
f = open('yuyu',encoding='gbk',mode='r') #可以设f变量,f_obj,file,f_handler.....等文件句柄。 s = f.read() print(s) f.close()
open是windows的系统功能,windows的默认编码方式是gbk,linux操作系统默认为utf-8。
流程:打开一个文件,产生一个句柄,对文件句柄进行操作,然后关闭。
读:r只读
1,文件以什么编码存储的就以什么编码方式打开。
2,文件路径:绝对路径,从根目录开始一级一级查找直到找到。
相对路径,在同一文件夹下直接写文件。
五种方式:
1,f.read,全部读出来。只读模式,可以不注明。默认就是只读模式。
f=open('yu.bak',encoding='utf-8')
2,f.readline,一行一行的读取。
3,f.readlines将原文件的每一行作为一个列表的元素读取。
4,f.read(n)在r模式下按照字符读取。n=(字符数)
在rb模式下read(n)按照字节读取。rb模式只读以bytes类型,非文字类的文件时用rb
5,循环读取。这种方式最好,占内存少。
f = open('yu','r',encoding='utf-8') for i in f: print(i.strip()) f.close()
写:w,write写模式
f = open('bk',encoding='utf-8',mode='w')
f.write('常常激励自己')
f.close()
w 写模式,没有文件时创建一个文件写入内容,有文件,将原文件内容清空,再写入内容。
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb
f=open('yu.bak',mode='rb') s= f.read(6) print(s) f.close()#b'alex\xe6\x98'
wb
f = open('yu',mode='wb') f.write('李海娜'.encode('utf-8')) f.close()
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
#3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】
#4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。
f = open('yu','r+',encoding='utf-8') s = f.truncate(4) print(s) f.close()
2,文件的修改
# ① 创建一个新的文件
# ② 读取一个原文件
# ③ 将原文件的内容通过你想要的方式进行更改并写入新文件
# ④ 将原文件删除
# ⑤ 将新文件重命名
with 语句:
1,功能一自动关闭文件句柄。2,一次性操作多个文件 。
# import os # with open('yu',encoding='utf-8')as f1,\ # open('yu.bak',encoding='utf',mode='w')as f2: # content = f1.read() # new_content = content.replace('SB','alex') # f2.write(new_content) # os.remove('yu')
#os.rename('yu.bak','yu')
1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
li = [] name_list = ['name','price','amount','year'] with open('a.txt',encoding='utf')as f1: for i in f1: l2 = i.strip().split() dic = {} for j in range(len(l2)): dic[name_list[j]] = l2[j] li.append(dic) print(li) sum = 0 for i in li: sum1 = int(i['price'])*int(i['amount']) sum += sum1 print(sum)
2,有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
import os with open('a1.txt',encoding='utf-8')as f1,\ open('a.txt',encoding='utf-8',mode='w')as f2: for i in f1: new_i = i.replace('alex','SB') f2.write(new_i) os.remove('a1.txt') os.rename('a1.txt','a.txt')