文件的编码
- 编码就是一种规则集合,记录了内容和二进制间进行相互转换的规则,编码有许多种,我们最常用的是UTF-8编码
- 常见的编码方式
- UTF-8:叫万国码-8bit是当前最流行的Unicode编码方式的字符集
- GBK:GBK 向下与 GB 2312 编码兼容,主要用于中文扩展
- 为什么需要使用编码:计算机只认识0和1,所以需要将内容翻译成0和1的形式才能保存在计算机中。
文件的操作
文件的定义
文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别
操作的步骤
- 1-打开文件
- 2-读写文件
- 3-关闭文件
文件的打开
示例:
# 使用open()函数打开文件
# FileNotFoundError: [Errno 2] No such file or directory: 'python.txt'
# 读模式下文件必须已存在
"""
name: 是要打开目标文件名的字符串(可以包含文件的具体路径)
mode:设置打开文件的模式(访问模式):只读、写入、追加等
encoding:设置编码格式,顺序不是第三位,所以不能位置参数,需要使用关键字参数
"""
f = open('python.txt', 'r', encoding='UTF-8')
print(f)
# 关闭文件
f.close()
总结:
- 文件的打开:文件对象 = open(文件路径,文件打开模式,encoding = 文件编码)
- 文件的关闭:文件对象.close()
文件的路径
示例:
# 绝对路径
# 定义文件路径
file_path = "D:\新建 文本文档.txt"
# 当路径中有特殊可以转义的字符时\就不会被作为文件路径分隔符,而作为转义字符,此时需要使用\\
file_path ="D:\\新建 文本文档.txt"
# 可以使用/来避免\作为转义字符
file_path = "D:/新建 文本文档.txt"
# 相对路径
# ./ 表示当前目录路径,打开文件时默认就是当前目录路径
# ../ 表示上级目录路径
file_path = "./python.txt"
# 可以原始字符串作为路径
file_path = r"D:\Python\01-序列的切片.py"
# 文件打开
f = open(file_path, 'r', encoding='UTF-8')
print(f)
# 关闭文件
f.close()
s1 = r"""
\t
"""
print(s1)
总结:
- 相对路径: ./代表当前目录(默认) …/回到上一级
- 绝对路径: 从根目录开始的就是绝对路径 window根目录就是C盘,D盘 linux根目录就是/
- 注意: 文件路径中的分隔符,建议使用\\或者/,不要直接用\
文件的读取
- read()方式读取文件内容
# 以r的模式打开文件,一般用于读取文本文件
# 1-打开文件
f = open('python.txt', mode='r', encoding='utf8')
# 2-操作文件
# 使用read(n)读取文件内容,如果传递n,固定读取n个字节,如果不传n默认读取全部内容
data = f.read()
# print(data)
data = f.read()
# print(data)
# 3-关闭文件
f.close()
# 以rb的模式打开文件,一般用于读取二进制文件(图像、音频、视频)
# 1-打开文件
# ValueError: binary mode doesn't take an encoding argument
# rb模式下不能有encoding参数
f = open('python.pdf', mode='rb')
# 2-操作文件
print(f.read())
# 3-关闭文件
f.close()
- 按行读取文件内容
# 以r的模式打开文件,按行读取
# 方式一:一次读取一行
# 打开文件
f = open('python.txt', mode='r', encoding='utf8')
# 读取文件
data = f.readline()
print(data)
print(f.readline())
# 关闭文件
f.close()
# 方式二:一次读取所有行,并返回列表
# 打开文件
f = open('python.txt', mode='r', encoding='utf8')
# 读取文件
data = f.readlines()
# 遍历列表
for line in data:
print(line, end='')
# 关闭文件
f.close()
- with open()语法打开文件
# 使用with open()语法读取文件内容
with open('python.txt', mode='r', encoding='utf8') as f:
# for line in f.readlines():
# print(line)
lines = f.readlines()
for line in lines:
print(lines)
总结:
- read(n):n表示要从文件中读取的数据的长度(单位是字节),如果没有传入n默认文件的全部内容
- readlines():可以按照行的文件把整个文件内容一次性读取,并返回一个列表,其中每一行的数据作为列表中的一个元素
- readline():一次读取一行内容,每次调用指针会自动向后移动
- with open语法:可以操作完成后自动关闭文件调用close()方法
文件的写入
- write()一个个写入
# 以w的模式打开文件,写入内容,一般用于文本数据写入文件
# 1-打开文件
f = open('word.txt', mode='w', encoding='utf8')
# 2-操作文件
# 使用write()函数写数据到文件,并返回写入文件的字节数量
data = f.write("你\n好\t世界")
print(data)
# 批量写入
f.flush()
# 3-关闭文件
f.close()
# 以wb模式打开文件,写入内容,一般用于二进制数据写入文件
# 打开文件
f = open('word.txt', mode='wb')
# 操作文件
data = "你好\n世界".encode('utf8')
print(data)
f.write(data)
# 关闭文件
f.close()
- writelines()一行行写入
# writelines()按行写入
# 打开文件
f = open('word.txt', mode='w', encoding='utf8')
# 操作文件
f.writelines(['open:打开\n', 'close:关闭\n', 'read:读取\n', 'write:写入\n', 'append:追加\n', 'byte:字节\n', 'binary:二进制\n'])
# 关闭文件
f.close()
- 文件追加写入
# 打开文件
f = open('word.txt', mode='a', encoding='utf8')
# 操作文件
f.write("hello world\n")
# 关闭文件
f.close()
总结:
- 写入方法
- f.write():一个个写
- f.writelines():一行行写
- f.flush()
- 直接调用write()时,内容并没有真正写入文件,而是会暂存在内存中,称之缓冲区buffer
- 当调用flush时,内容会真正地批量写入磁盘文件
- 这样做是为了避免频繁操作磁盘
- 使用w模式,文件如果不存在,会创建新文件,文件如果存在,会将原有内容清空再写入
- 使用a模式,文件不存在会创建新,文件如果存在,不会清空内容会追加写入文件
文件的备份
数据:
name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式
需求:
实现需求:
读取文件
将文件写出到bill.txt.bak文件作为备份
同时,将文件内标记为测试的数据行丢弃
实现思路:
open和r模式打开一个文件对象,并读取文件
open和w模式打开另一个文件对象,用于文件写出
for循环内容,判断是否是测试不是测试就write写出,是测试就continue跳过
将2个文件对象均close()
示例:
# 打开文件用于读取
f_read = open('D:\\python\\bill.txt', mode='r', encoding='utf8')
# 打开文件用于写入
f_write = open('D:\\python\\bill.txt.bak', mode='w', encoding='utf8')
# 操作文件
data = f_read.readlines()
# 定义新的列表用于保存丢弃包含测试数据行之后的列表
new_data = []
# print(data)
# 通过判断是否包含'测试',将不包含的数据行写入到新的列表
for line in data:
if line.find('测试') == -1:
new_data.append(line)
print(new_data)
# 将文件内标记为'测试'的数据行丢弃
f_write.writelines(new_data)
# 关闭文件
f_read.close()
f_write.close()
文件综合案例
数据:
name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式
需求:
统计每个人的消费总金额,并将结果写入到文件
示例:
# 打开文件用于读取
f_read = open('D:\\python\\bill.txt', mode='r',
encoding='utf8')
# 统计每个人的消费总金额,并将结果写入到文件
# 定义字典用于保存每个人的消费总金额
consume_dict = {
"周杰轮": 0,
"林俊节": 0,
"张学油": 0,
"王力鸿": 0,
"刘德滑": 0
}
# 操作文件处理数据
lines = f_read.readlines()
# 遍历列表,按行处理数据
for line in lines:
if line.find('消费') != -1:
consume_list = line.split(',')
print(consume_list[0], consume_list[2], type(consume_list[2]))
# 以人名作为key,以消费金额作为value进行计算
# consume_list[0]就是当前行的人名
# consume_list[2]就是当前行的消费金额
consume_dict[consume_list[0]] += int(consume_list[2])
print(consume_dict)
# 将计算结果写入到结果文件中
# 打开文件用于写入
f_write = open('D:\\python\\result.txt', mode='w', encoding='utf8')
# 操作文件
f_write.write(consume_dict.__str__())
# 关闭文件
f_write.close()
f_read.close()
标签:文件,01,Python,data,写入,2022,操作,open
From: https://blog.csdn.net/JY_030212/article/details/142424578