python文件操作(文件常用操作方法,文件的改)
文件操作初识
护士空姐学生少妇联系方式.txt
python代码
path 文件路径: D:\ 护士空姐学生少妇联系方式.txt
enconding 编码方式: utf-8 gbk....
mode 操作方式: 只读,只写,追加,读写,写读....
路径:绝对路径:从根目录开始找到文件
相对路径:从当前目录开始找到文件
错误原因分析:
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())
f1.close()
凡是带b的不用带encoding
凡是r 模式,mode='r'可以省略不写
gbk utf-8 对于字母,数字,特殊字符的编码都是引用ascii码,所以可以直接转化。 s1 = '123abc*' b1 = s1.encode('utf-8') s2 = b1.decode('gbk') print(s2)
# f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8',mode='r') ##d:\护士空姐学生少妇.txt'绝对路径 # print(f1.read()) # f1.close() # f1 = open('d:\untitled3\day8\大爷来玩啊',encoding='utf-8',mode='r')#绝对路径一定要简单,太长的话容易报错。 # f1.close() # f2= open('大爷,来玩啊',encoding='utf-8',mode='r')#'大爷,来玩啊,相对路径 # print(f2.read()) # f2.close()
'''
变量:f1_obj,f1_file,file,file_handle... 文件句柄。
open python的内置函数,但是底层调用的是windows的open功能,open 是操作文件用的
windows系统默认的编码方式是gbk,masos,linux用的是 utf-8
流程:1打开文件,产生文件句柄
2对文件句柄进行相关的操作
3关闭文件
'''
# r rb
# r模式:read(n) n 是按照字符读取。
# rb模式:read(n) n 是按照字节读取
#
# 1.f.read() 全部读出来
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.read())
f1.close()
# 2.f.read(n)
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.read(1)) #r是以字符为单位读取的
f1.close()
f1= open('d:\护士空姐学生少妇.txt',mode='rb')
print(f1.read(3))#rb是以字节为单位读取的
f1.close()
# 3.readline 按行读取
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.readline())
print(f1.readline())
print(f1.readline())
print(f1.readline())
f1.close()
# 4.readlines 返回一个list,里面的元素是一行
f1= open('d:\护士空姐学生少妇.txt',encoding='utf-8')
print(f1.readlines())
f1.seek(0)#将光标放到开头,for循环才可以执行。
for line in f1.readlines():
print(line)
f1.close()
# for 循环去读
f1=open('d:\护士空姐学生少妇.txt',encoding='utf-8')
for line in f1:
print(line)
f1.close()
# rb模式 非文字类的文件
f1 = open('护士学生空姐班主任.txt',mode='rb')
print(f1.read(1))
f1.close()
# r+ 读写 先读后写
f1 = open('大爷,来玩啊', encoding='utf-8',mode='r+')
print(f1.read())
f1.write('666')
f1.close()
# w wb 模式
# w:没有文件,创建文件些内容
# w:有文件,清空原来内容,重新写内容
f1 = open('log1', encoding='utf-8',mode='w')
f1.write('heheda')
f1.close()
f1 = open('log1', encoding='utf-8',mode='w')
f1.write('jvkjvalnvaiklvd')
f1.close()
wb
f1 = open('log2', mode='wb') f1.write('法国进口分类结果'.encode('utf-8'))#必须转化为bytes 类型 f1.close()
w+ 先写后读
# f1 = open('log1', encoding='utf-8', mode='w+') # f1.write('djcjcn.....') # f1.seek(0) # 调整光标才能读出来 # print(f1.read()) # f1.close()
w+b
a ab
# a:没有文件,创建新文件写内容
# ab:有文件,在文件后面追加内容
f1 = open('log4', encoding='utf-8', mode='a')
f1.write('666')
f1.close()
a+ 追加可读
# f1 = open('log4', encoding='utf-8', mode='a+') # f1.write('范德萨急功近利开发工具') # f1.seek(0) # print(f1.read()) # f1.close() # f1 = open('log4', mode='ab') # f1.write('中国'.encode('gbk'))#pycharm 编码方式是utf-8,会出现乱码的情况。 # f1.close()
# 非文字文件的读取和写入?
f1 = open('d:\pian.jpg', mode='rb')
content=f1.read()
print(content)
f2 = open('d:\pian.jpg', mode='wb')
f2.write(content)
read write read(n) readline() readlines() seek
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())
seek: 按照字节去调整光标
f1.seek(0,2)#光标放到末尾
f1.seek(0)#光标放到句首
f1 = open('log1', encoding='utf-8')
f1.seek(6)#调整6个字节
print(f1.read())
f1.close()
tell 告诉光标的位置
f1 = open('log1', encoding='utf-8') print(f1.tell())#没读之前光标是在0位的 print(f1.read())#将文章全部读取 print(f1.tell())#读取文章后光标到最后了 f1.close()
truncate 对原文件进行截取内容,以字节形式,只能在a模式下使用。
f1 = open('log1', encoding='utf-8', mode='a') f1.truncate(6)#截取6个字节的内容,其他内容清除 f1.close()
文件操作的另一种写法
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('123456')#w:如果有文件,清空原文件,写入新内容。
with open('log1', encoding='utf-8') as f1:
content = f1.read()
print(content)
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('alex', 'SB')
f2.write(new_line)
os.remove('change')
os.rename('change.bak', 'change')
tast
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}......] 并计算出总价钱。
list=[]
with open('1',encoding='utf-8') as f1:
for line in f1:
new_line=line.strip().split()
dic={'name':new_line[0],'price':new_line[1],'amount':new_line[2]}#new_line[]本来就是str,不用加引号
list.append(dic)
print(list)
sum=0
for i in list:
sum+=int(i['price'])*int(i['amount'])
print(sum)
方法二
list=[]
with open('1',encoding='utf-8') as f1:
for line in f1:
line=line.strip().split()
dic={'name':line[0],'price':line[1],'amount':line[2]}
list.append(dic)
print(list)
sum=0
for i in list:
money=int(i['price'])*int(i['amount'])#要弄清楚要算什么。i[1]和i[2]对应的是字典,没办法相乘。
sum+=money
print(sum)
方法一
list1=['name','price','amount']
list=[]
with open('1',encoding='utf-8') as f1:
for line in f1:
line=line.strip().split()
dic = {}
for i in range(len(list1)):
dic[list1[i]]=line[i]
list.append(dic)
print(list)
sum=0
for i in list:
sum+=int(i['price'])*int(i['amount'])
print(sum)
2,有如下文件:
-------
爱因斯坦是相对论的先驱。
爱因斯坦其实是gay。
----------
将文件中所有的爱因斯坦都替换成大写的SB。
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','爱因斯坦')
f2.write(new_line)
os.remove('change')
os.rename('change.bak','change')
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}......]
并计算出总价钱。
sum=0 with open('a1',encoding='utf-8') as f1: # open('a1.bak',encoding='utf-8',mode='w')as f2: l_lst = [] for line in f1: dic = {} # 字典要放在第一个for 循环下面,这样才能增加不同的字典。 l1=line.strip().split() # 此时l1是列表 # print(l1) for i in l1: l2 =i.strip().split(':') # 将l1中的元素分割成列表l2:l2是动态的,可以表示四个不一样的列表,所以添加列表要和循环对齐。 # print(l2) dic[l2[0]] = l2[1] dic.pop('year') # 删除掉不要的元素year l_lst.append(dic) print(l_lst) for i in l_lst: sum+=int(i['amount'])*int(i['price']) print(sum)
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,'备注':'单身狗'},
......]
并计算出总价钱。
l_lst=[] with open ('a2',encoding='utf-8') as f: l1=f.readline().strip().split() # 先把第一行读取出来 ['序号', '部门', '人数', '平均年龄', '备注'] print(l1) for line in f: # 读取剩下的 dic = {} l2=line.strip().split() # split()以空格分割(多少个空格都可以) for i in range(len(l1)): dic[l1[i]]=l2[i] # 用同样的参数,才能确保一一对应 l_lst.append(dic) print(l_lst)