1.6-python基础文件操作-编码
文件操作
初始文件操作
用python开操作文件,需要的参数:
- 文件路径
- 编码方式
- 操作模式:只读,只写,追加,读写
f = open(r'D:\赵贺学习python\我爱学习学习使我快乐', mode='r', encoding='utf-8')
content = f.read()
print(content)
f.close()
解释:
f: 变量,文件句柄;
open: 是python调用的操作系统(windows,linux等)的功能;
D:\赵贺学习python\我爱学习学习使我快乐: 文件的路径;
mode: 定义操作方式:r为读模式;
encoding: 声明编码或解码
f.read(): 操作文件,通过文件句柄进行操作;
f.close(): 关闭文件句柄(必须主动关闭)
操作文件的流程:
1.打开文件,得到文件句柄并赋值给一个变量;
2.通过句柄对文件进行操作;
3.关闭文件;
文件操作模式:读, 写, 追加
文件操作:读
r模式:
以只读方式打开文件,文件的指针会放在文件的开头。默认模式,如果不设置mode,默认使用r模式操作文件;
# read() 将文件内容全部读取出来;弊端:如果文件很大就会非常占用内存,容易导致内存崩溃
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg = f.read()
f.close()
print(msg)
# 这种方式一次读取出来了
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg1 = f.read(2)
msg = f.read()
f.close()
print(msg)
print(msg1)
# read()读取的时候指定读取到什么位置,在r模式下,n按照字节读取
readline()读取每次只读取一行,readline()读取出来的数据后都有一个\n,加strip()脱掉
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
# readlines() 返回一个列表,列表里的每一个元素是原文件的每一行,如果文件很大,占内存,容易崩溃
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg = f.readlines()
f.close()
print(msg)
for循环
# 可以通过for循环去读取,文件句柄是一个迭代器,特点就是每次循环只在内存中占一行的数据,非常节省内存;
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
for line in f:
print(line)
f.close()
# ps.读完的文件句柄一定要关闭
rb模式
rb模式:以二进制格式打开一个文件,用于只读。主要操作对象是非文件内容:图片,音频,视频等。如果用带b的模式操作文件,不用声明编码方式;
写
如果文件不存在,利用w模式操作文件,会先创建文件,然后写入内容;
如果文件存在,利用w模式操作文件,会先清空原文件内容,再写入新内容;
wb模式:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。一般也用于非文本文件;
举例:以rb模式将一个图片的内容以bytes类型全部读取出来,然后再以wb将全部读取出来的数据写入一个新文件,就完成了一个类似图片复制的流程:
# step1:将图片以rb模式读取出来
f = open('1.jpg', mode='rb')
content = f.read()
f.close()
# step2: 将读取出来的数据通过wb模式写入新文件
f1 = open('2.jpg', mode='wb')
f1.write(content)
f1.close()
文件的追加
a模式:打开一个文件用于追加,如果文件存在,指针放在文件的结尾;如果不存在,就创建新文件进行写入;
文件的操作模式
1.打开文件的模式
r,只读模式
w,只写模式
a,只追加模式
# 对于非文本文件
rb
wb
ab
# 不能指定编码
# +模式
r+, 读写
w+, 写读
a+, 写读
# r+模式,文件指针会默认放在文件的开头。度过在读写模式下,先写后读,文件就会出现问题;
# 以bytes类型操作的模式
r+b, 读写
w+b, 写读
a+b, 写读
文件的另一种打开方式
with open() as ...
不需要手动关闭文件句柄
with open('学习文件模式.txt', encoding='utf-8') as f:
f.read()
with open('学习文件模式.txt', encoding='utf-8') as f1,\
open('我爱学习学习使我快乐', encoding='utf-8', mode='w') as f2:
f1.read()
f2.write('黑色利穆')
文件的修改
文件的数据是放在硬盘上的,因而只存在覆盖,不存在修改;平时看到修改的文件都是模拟出来的效果,实现方法:
方法一:将硬盘存放该文件的内容全部加载到内存,在内存中修改,修改完毕后,再由内存覆盖到硬盘;(word,vim,nodpad)
import os
with open('学习文件模式.txt', encoding='utf-8') as read_f, \
open('.学习文件模式.txt', 'w', encoding='utf-8') as write_f:
data = read_f.read() # 全部读入内存,如果文件很大,会很卡
data = data.replace('爱我中华', '我爱祖国') # 在内存中完成修改
write_f.write(data) # 一次性写入新文件
os.remove('学习文件模式.txt') # 删除源文件
os.rename('.学习文件模式.txt', '学习文件模式.txt') # 将新建的文件重命名为源文件
方法二:将硬盘存放在该文件的内容一行一行的读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os
with open('学习文件模式.txt', encoding='utf-8') as read_f, \
open('.学习文件模式.txt', 'w', encoding='utf-8') as write_f:
for line in read_f:
line = line.replace( '我爱祖国', '爱我中华')
write_f.write(line)
os.remove('学习文件模式.txt') # 删除源文件
os.rename('.学习文件模式.txt', '学习文件模式.txt') # 将新建的文件重命名为源文件
练习
'''
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}......] 并计算出总价钱。
'''
b = '''apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
'''
# with open('a.txt', 'w', encoding='utf-8') as f:
# f.write(b)
with open('a.txt', encoding='utf-8') as f:
lst = []
for line in f:
line = line.strip().split(' ')
line = ({'name': line[0], 'price': line[1], 'amount': line[2]})
lst.append(line)
print(lst)
sum = 0
for i in lst:
unit_price = (int(i['price']) * int(i['amount']))
sum += unit_price
print('总价为:', sum)
'''
-------
heiselimu是世界上最帅的男人;
heiselimu其实也没那么帅;
你说heiselimu帅不帅
不管你们说heiselimu帅不帅,我就觉得他是最帅的
----------
将文件中所有的heiselimu都替换成大写的HSLM。
'''
b = '''
-------
heiselimu是世界上最帅的男人;
heiselimu其实也没那么帅;
你说heiselimu帅不帅
不管你们说heiselimu帅不帅,我就觉得他是最帅的
----------
'''
# with open('b.txt', 'w', encoding='utf-8') as f:
# f.write(b)
import os
with open('b.txt', encoding='utf-8') as f_r, \
open('.b.txt', 'w', encoding='utf-8') as f_w:
for line in f_r:
f_w.write(line.replace('heiselimu', 'HSLM'))
os.remove('b.txt')
os.rename('.b.txt', 'b.txt')