文件操作的大纲:
读模式: *r read read(n) readline() readlines() for循环 最好的 rb *r+ r+b 写模式: *w w:没有文件,创建文件写内容。 w:如果有文件,清空原文件,写入新内容。 wb w+ w+b 追加模式 *a a:没有文件,创建文件写内容。 a:如果有文件,最后面追加新内容。 ab a+ a+b 补充: gbk utf-8 对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。 s1 = '123abc*' b1 = s1.encode('utf-8') s2 = b1.decode('gbk') print(s2)
一,文件操作初识 创建一个文件例:新建一个报表.txt,保存在D盘下。用python代码去写,类似于wap,word的应用程序功能 f1 = open('d:学生家长联系方式.txt', encoding='GB2312', mode='r') print(f1.read()) f1.close()
path 文件路径: d:人员联系方式.txt
encoding编码方式: utf-8 , gbk.....
mode 操作方式:只读,只写,追加,读写,写读...
路径:绝对路径:从根目录开始,一级一级的一直找,找到文件为止,在Pytharm里,打开文件,得到文件句柄并赋值给一个变量。
相对路径:从当前目录开始找到文件。
绝对路径:
f1 = open (' d:人员联系方式.txt' , encoding = 'utf-8' ,mode='r') print(f1.read()) f1.close (绝对路径就是在A,B,C,D,E,的盘里面找,不在同一个文件夹里面找)。
相对路径:
f2 = open('人员联系方式.txt' ,encoding = 'utf-8')
print(f2.read())
f2.close() (在同一个文件里面找)
变量:f1_obj,f1_file,file,file_handle...文件句柄。
open python的内置函数,但是底层调用的Windows系统的open功能,open功能就是操作文件用的。
windows 系统默认的编码方式gbk,linux,macos:utf-8.
流程:
1,打开文件,产生文件句柄。
2,对文件句柄进行相应的操作。
3,关闭文件。
错误原因分析:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte
编码错误:文件存储时编码方式与文件打开时的编码方式不一致。
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated uXXXX escape
改正错误 两种:
第一种:加r
f1 = open(r'd:u护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
print(f1.read())
f1.close()
第二种:加
f1 = open('d:\护士空姐学生少妇联系方式.txt', encoding='GB2312', mode='r')
print(f1.read())
读模式
*** r:只读,可以默认不写
r ,rb 模式:
r模式,read(n) 是按照字符读取。
rb模式。read(n) 是按字节读取。
f.read()全部读出来
f1 = open ('E:人员联系方式'.txt,mode='rb')
print(f1.read())
f1.close()
##b'xefxbbxbfxe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9ax84xe8xb0
f.read(n)
f1 = open('护士学生空姐班主任.txt', encoding='utf-8')
print(f1.read(3))
f1.close()
bytes类型只操作非文字文件
f1.readline() 按行读取.
f1 = open('E:人员联系方式‘txt',encoding='utf-8')
print(f1.readline())
print(f1.readline())
print(f1.readline())
print(f1.readline())
readlines( )返回一个list,里面的元素是每一行。
f1 = open('E:人员联系方式‘txt',encoding='utf-8')
print(f1.readlines())
f1.close
for 循环去读去。
f1 = open('E:人员联系方式‘txt',encoding='utf-8')
for line in f1:
printd(line)
f1.close() #打印出来的是写入的文字
rb 模式 非文字类文件
f1 = open('护士学生空姐班主任.txt',mode='rb')
print(f1.read(1))
f1.close()
凡是带b不用encoding
只有是r模式 mode='r'可以省略不写
rb bytes类型读取。
带b的都是非文本文件 , rb模式 非文字类文件
***r+:读写,先读后写
f1 = open('E:人员联系方式.txt',encoding='utf-8',mode='r+')
print(f1.read())
f1.write('666')
f1.close( ) # 打印出写的文字
r+b:读写,先读后写
f1 = open('E:人员联系方式.txt',mode='r+b')
print(f1.read())
f1.write('666'.encode('utf-8'))
f1.close( ) #b'xefxbbxbfxe5xa5xbdxe7x9ax84xe5xa5xbdxe7x9a
写模式:
w,wb 模式
w:写:没有文件,创建文件写内容。如果有文件,清空原文件,写入新内容。
f1 = open('log1',encoding='utf-8',mode='w')
f1.write('老男孩是最好的培训学校。。')
f1.close
f1 = open('log1',encoding='utf-8',mode='w')
f1.write('老男孩’)
f1.close()
wb 模式
f1 = open('log2', mode='wb')
f1.write('法国进口分类结果'.encode('utf-8'))
f1.close()
rb与wb的区别
f1 = open('log2',mode='wb')
f1.write('老男孩'.encode('utf-8'))
f1.close()
w+:先写后读
f1 = open('log1',encoding='utf-8',mode='w+')
f1.write('老男孩...')
f1.seek(0) #调整光标
print(f1.read( ))
f1.close() #老男孩...
追加模式
w + b
a ab
补充:对于英文字母数字特殊字符,utf-8与gbk可以互相识别。
但非字母就不可以。
f1 = open('log1',encoding='utf-8',mode='a')
f1.write('barry')
f1.close()
a:没有文件创建文件写内容。
a+:有文件,直接在元文件的后面住家新内容。
f1 = open('log3',encoding='utf-8',mode='a')
f1.write('barry')
f1.close()
f1 = open('log3',mode='ab')
f1.write('中国'.encode('gbk'))
f1.close() #(打印增加乱码,把'gbk'换成'utf-8'出现中国
a+ 追加可读
f1 = open('log3', encoding='utf-8', mode='a+')
f1.write('范德萨急功近利开发工具')
f1.seek(0)
print(f1.read()) #中国范德萨急功近利开发工具
f1.close()
ps 非文字的文件的读取写入
f1 = open('11.jpg',mode='rb')
content = f1.read()
print(content)
f2 = open('小猪配奇'.jpg',mode='wb')
f2.write(content)
常用方法:
readlable() 判断是否可读
writeable()判断是否可写
f1 = open('log1', encoding='utf-8')
print(f1.readable())
print(f1.writable())
f1 = open('log1', encoding='utf-8',mode='r+')
print(f1.readable())
print(f1.writable())
read wtite read(n) readline() readlines() seek
f1 = open('log1',encoding='utf-8')
print(f1.readable()) #True
print(f1.writable()) False
seek:按照字节去调整光标
seek(0)从开始调节
seek(0,2)将光标调整到最后
f1 = open('log1',encoding='utf-8')
f1.seek(3)
print(f1.read())
f1.close()
tell也是按字节读告诉光标位置
1 = open('log1', encoding='utf-8')
print(f1.tell())
print(f1.read())
print(f1.tell())
f1.close()
struncate (a,a+模式下)对原文件进行截取内容,以字节形式,只能在a模式下使用。
f1 = open('log1',encoding='utf-8',mode='w')
f1.truncate(3)
f1.close()
gbk,utf-8
对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。
s1 = '123abc*'
b1 = s1.encode('utf-8')
s2 = b1.decode('gbk')
print(s2) #123abc*
文件对的另一种写法:
with open() as 不用主动关闭 f1.close()
同一open 可以操作多个文件
with open('log1', encoding='utf-8') as f1:
print(f1.read())
with open('log1', encoding='utf-8') as f1,
open('log2',encoding='utf-8', mode='w') as f2:
print(f1.read())
f2.write('666')
with open('log1', encoding='utf-8') as f1:
content = f1.read()
f1.close()
pass
with open('log1', encoding='utf-8',mode='w') as f2:
f2.write('333')
文件的改:
1,打开原文件 old_file,将原内容读取到内存。
2,创建一个新文件new_file。
3,将原内容通过你改写形成新内容,写入到新文件。
4,将原文件删除。
5,将新文件重命名成原文件。
方法一,原文件内容不打,可以用此方法,但是此方法还是很low。
import os
with open('change', encoding='utf-8') as f1,
open('change.bak', encoding='utf-8', mode='w') as f2:
old_content = f1.read()
new_content = old_content.replace('alex', 'SB')
f2.write(new_content)
os.remove('change')
os.rename('change.bak', 'change')
方法2
import os
with open('change', encoding='utf-8') as f1,
open('change.bak', encoding='utf-8', mode='w') as f2:
for line in f1:
new_line = line.replace('SB', 'alex')
f2.write(new_line)
os.remove('change')
os.rename('change.bak', 'change')
练习题:
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}......] 并计算出总价钱。
goods_info = [] with open("a.txt",encoding="utf-8") as f: for line in f: line = line.strip().split() dic = {"name": line[0],"price": line[1],"amount": line[2]} goods_info.append(dic) print(goods_info) goods_info = [] list_name = ["name", "price", "amount", 'time'] with open("a.txt",encoding="utf-8") as f: for line in f: line = line.strip().split() # ['apple', '10', '3', '2016'] dic = {} for i in range(len(line)): dic[list_name[i]] = line[i] # dic['name'] = 'apple' dic['price'] = '10' goods_info.append(dic) print(goods_info) sum = 0 for i in goods_info: money = int(i['price']) * int(i['amount']) sum += money print(sum)
2,有如下文件: ------- alex是老男孩python发起人,创建人。 alex其实是人妖。 谁说alex是sb? 你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。 ---------- 将文件中所有的alex都替换成大写的SB。
2,有如下文件: ------- alex是老男孩python发起人,创建人。 alex其实是人妖。 谁说alex是sb? 你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。 ---------- 将文件中所有的alex都替换成大写的SB。
3.文件a1.txt内容 文件内容: name:apple price:10 amount:3 year:2012 name:tesla price:100000 amount:1 year:2013 通过代码,将其构建成这种数据类型: [{'name':'apple','price':10,'amount':3}, {'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。 str = """name:apple price:10 amount:3 year:2012 name:tesla price:100000 amount:1 year:2013
with open(r'a1.txt','w',encoding='utf-8') as write_f: write_f.write(str) person_list = [] sum = 0 with open(r'a1.txt','r',encoding='utf-8') as read_f: for lines in read_f: line_list = lines.strip().split() dic = {} for line in line_list: line = line.strip().split(":") dic[line[0]] = line[1] dic.pop('year') person_list.append(dic) for line in person_list: sum += (int(line['price']) * int(line['amount'])) print(sum)
4,文件a2.txt 文件内容: 序号 部门 人数 平均年龄 备注 1 python 30 26 单身狗 2 Linux 26 30 没对象 3 运营部 20 24 女生多 通过代码,将其构建成这种数据类型: [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'}, ......] 并计算出总价钱。 序号 部门 人数 平均年龄 备注 1 python 30 26 单身狗 2 Linux 26 30 没对象 3 运营部 20 24 女生多 通过代码,将其构建成这种数据类型: [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'}, ......] 并计算出总价钱。
f = open('a2', encoding='utf-8') # 以读的方式打开一个文件,获得一个文件句柄 f1 = f.readline() # 用文件句柄把第一行文件读取出来,将内容赋值给f1 f1 = f1.strip().split() # 对第一行文件内容以空格进行分割,形成一个列表赋值给f1 li = [] # 建立一个空列表li for i in f: # 循环读取文件剩下的每一行内容,将内容赋值给i i1 = i.strip().split() # 对读取出来的每一行内容去除首尾空格换行符等, # 然后以空格进行分割,形成一个列表赋值给i1 dic = {} # 建立一个空字典dic for j in range(len(i1)): # 循环i1列表的索引值 dic[f1[j]] = i1[j] # 给dic添加键值对,f1通过索引找到内容作为dic的键, # i1通过索引找到内容作为值,将键值对添加到dic中 li.append(dic) # 将dic添加到li这个列表里面 print(li) # 打印li f.close() # 关闭文件