文件的编码
文件编码
思考:计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?
答案:使用编码技术(密码本)将内容翻译成0和1存入。
编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。
计算机中有许多可用编码:
UTF-8
GBK
Big5
等
不同的编码,将内容翻译成二进制也是不同的。
编码有许多,所以要使用正确的编码, 才能对文件进行正确的读写操作呢。
如上,如果你给喜欢的女孩发送文件,使用编码A进行编码(内容转二进制)。
女孩使用编码B打开文件进行解码(二进制反转回内容)
自求多福吧。
查看文件编码
我们可以使用Windows系统自带的记事本,打开文件后,即可看出文件的编码是什么:
UTF-8是目前全球通用的编码格式
除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。
总结
编码就是一种规则集合,记录了内容和二进制间进行相互转换的规则,编码有许多种,我们最常用的是UTF-8编码
常见的编码方式
UTF-8:叫万国码-8bit是当前最流行的Unicode编码方式的字符集
GBK:GBK 向下与 GB 2312 编码兼容,主要用于中文扩展
为什么需要使用编码:计算机只认识0和1,所以需要将内容翻译成0和1的形式才能保存在计算机中。
文件的读取
什么是文件
内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了"文件"的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
文件操作包含哪些内容呢?
在日常生活中,文件操作主要包括打开、关闭、读、写等操作。
文件的操作步骤
想想我们平常对文件的基本操作,大概可以分为三个步骤(简称文件操作三步走):
① 打开文件
② 读写文件
③ 关闭文件
注意事项:可以只打开和关闭文件,不进行任何读写
open()打开函数
在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下
python
open(name,mode,encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐使用UTF-8)
示例代码:
python
f = open('python.txt','r',encoding='UTF-8')
# encoding的顺序不是第三位,所有不能用位置参数,用关键字参数直接指定
注意:此时的`f`是`open`函数的文件对象,对象是Python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性或对象.方法对其进行访问,后续面向对象课程会给大家进行详细的介绍。
示例:
python
# 使用open函数打开文件
# FileNotFoundError: [Errno 2] No such file or directory: 'python.txt'
# 读模式下文件必须已存在
"""
name: 是要打开目标文件名的字符串(可以包含文件的具体路径)
mode:设置打开文件的模式(访问模式):只读、写入、追加等
encoding:设置编码格式,顺序不是第三位,所以不能位置参数,需要使用关键字参数
"""
f = open('python.txt', 'w', encoding='utf-8')
print(f)
# 关闭文件
f.close()
总结:
文件的打开:文件对象 = open(文件路径,文件打开模式,encoding = 文件编码)
文件的关闭:文件对象.close()
文件的路径
示例:
python
# 绝对路径
# 定义文件路径
file_path = "E:\software\pyCharmdata\python_base\data_7\python.txt"
# 当路径中有特殊可以转义的字符时\就不会被作为文件路径分隔符,而作为转义字符,此时需要使用\\
file_path = "E:\\software\\pyCharmdata\\python_base\\data_2\\01-Literals.py"
# 可以使用/来避免\作为转义字符
file_path = "E:/software/pyCharmdata/python_base/data_2/01-Literals.py"
# 相对路径
# ./ 表示当前目录路径,打开文件时默认就是当前目录路径
# ../ 表示上级目录路径
file_path = "./python.txt"
# 可以原始字符串作为路径
file_path = r"E:\software\pyCharmdata\python_base\data_2\01-Literals.py"
# 文件的打开
f = open(file_path, "r", encoding="utf-8")
print(f.read())
# 关闭文件
f.close()
总结:
相对路径: ./代表当前目录(默认) ../回到上一级
绝对路径: 从根目录开始的就是绝对路径 window根目录就是C盘,D盘 linux根目录就是/
注意: 文件路径中的分隔符,建议使用\\或者/,不要直接用\
mode常用的三种基础访问模式
|--------|--------------------------------------------------------------|
| 模式 | 描述 |
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
| w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。 如果该文件不存在,创建新文件。 |
| a | 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。 如果该文件不存在,创建新文件进行写入。 |
读操作相关方法
read()方法:
python
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
readlines()方法:
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
python
f = open('python.txt')
content = f.readlines()
# ['hello world\n','abcdefg\n','aaa\n','bbb\n','ccc']
print(content)
# 关闭文件
f.close()
readline()方法:一次读取一行内容
python
f = open('python.txt')
content = f.readline()
print(f'第一行:{content}')
content = f.readline()
print(f'第二行:{content}')
# 关闭文件
f.close()
for循环读取文件行
python
for line in open("python.txt","r"):
print(line)
# 每一个line临时变量,就记录了文件的一行数据
close() 关闭文件对象
python
f = open("python.txt","r")
f.close()
# 最后通过close,关闭文件对象,也就是关闭对文件的占用
# 如果不调用close,同时程序没有停止运行,那么这个文件将一直被Python程序占用。
with open 语法
python
with open("python.txt","r") as f:
f.readlines()
# 通过在with open的语句块对文件进行操作
# 可以在操作完成后自动关闭close文件,避免遗忘掉close方法
示例
- read()方式读取文件内容
python
# # 以r的方式打开文件,一般用于读取文本文件
# # 1-打开文件
# f = open('python.txt', mode='r', encoding='utf-8')
# # 2-操作文件
# # 使用read(n)读取文件内容,如果传递n,固定读取n个字节,如果不传n默认读取全部内容
# data = f.read()
#
# print(data)
#
# # 3-关闭文件
# f.close()
# # 用rb的模式打开文件,一般用于读取二进制文件如(音频、视频、图片)
# # 1-打开文件
# # ValueError: binary mode doesn't take an encoding argument
# # rb模式下不能有encoding参数
# f = open('18-PyCharm安装使用.mp4', mode='rb')
# # 2-操作文件
# print(f.read())
# # 3-关闭文件
# f.close()
- 按行读取文件内容
python
# # 以r的模式打开文件,按行读取
# # 方式一:一次读取一行
# # 1-打开文件
# f = open('python.txt', 'r', encoding='utf-8')
# # 2-读取文件
# data = f.readline()
# print(data)
# print(f.readline())
# print(f.readline())
# # 关闭文件
# f.close()
# # 方式二:一次读取所有行,并返回列表
# # 打开文件
# f = open('python.txt', 'r', encoding='utf-8')
# # 2-读取文件
# data = f.readlines()
# print(data)
# # 关闭文件
# f.close()
- with open()语法打开文件
python
# 使用with open()语法读取文件内容
with open('python.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line)
# f.close() 省略
总结:
read(n):n表示要从文件中读取的数据的长度(单位是字节),如果没有传入n默认文件的全部内容
readlines():可以按照行的文件把整个文件内容一次性读取,并返回一个列表,其中每一行的数据作为列表中的一个元素
readline():一次读取一行内容,每次调用指针会自动向后移动
with open语法:可以操作完成后自动关闭文件调用close()方法
操作汇总
|-----------------------------------|--------------------------|
| 操作 | 功能 |
| 文件对象 = open(file, mode, encoding) | 打开文件获得文件对象 |
| 文件对象.read(num) | 读取指定长度字节 不指定num读取文件全部 |
| 文件对象.readline() | 读取一行 |
| 文件对象.readlines() | 读取全部行,得到列表 |
| for line in 文件对象 | for循环文件行,一次循环得到一行数据 |
| 文件对象.close() | 关闭文件对象 |
| with open() as f | 通过with open语法打开文件,可以自动关闭 |
总结
操作文件需要通过open函数打开文件得到文件对象
文件对象有如下读取方法:
read()
readline()
readlines()
for line in 文件对象
- 文件读取完成后,要使用文件对象.close()方法关闭文件对象,否则文件会被一直占用
文件的定义:文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别
操作的步骤:
1-打开文件
2-读写文件
3-关闭文件
文件的写入
写操作快速入门
案例演示:
python
# 1.打开文件
f = open('python.txt','w')
# 2.文件写入
f.write('hello world')\
# 3.内容刷新
f.flush()
注意:
直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
当调用flush的时候,内容会真正写入文件
这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
写操作注意
文件如果不存在,使用"w"模式,会创建新文件
文件如果存在,使用"w"模式,会将原有内容清空
示例
- write()一个个写入
python
# 以w的模式打开文件,写入内容,一般用于文本数据写入文件
# 1-打开文件
f = open('test.txt', 'w', encoding='utf-8')
# 2-操作文件
# 使用write()函数写数据到文件,并返回写入文件的字节数量
data = f.write('Hello, world!')
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()一行行写入
python
# 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()
- 文件追加写入
python
# 打开文件
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模式,文件不存在会创建新,文件如果存在,不会清空内容会追加写入文件
close()方法,带有flush()方法的功能
文件的追加
追加写入操作快速入门
案例演示:
python
# 1.打开文件,通过a模式打开即可
f = open('python.txt','a')
# 2.文件写入
f.write('hello world')
# 3.内容刷新
f.flush()
注意: a模式,文件不存在会创建文件 a模式,文件存在会在最后,追加写入文件
文件的备份
有一份账单文件,记录了消费收入的具体记录,内容如下:
数据:
python
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文件
需求:
我们现在要做的就是:
读取文件
将文件写出到bill.txt.bak文件作为备份
同时,将文件内标记为测试的数据行丢弃
实现思路:
open和r模式打开一个文件对象,并读取文件
open和w模式打开另一个文件对象,用于文件写出
for循环内容,判断是否是测试不是测试就write写出,是测试就continue跳过
将2个文件对象均close()
示例:
python
# 打开文件用于读取
f_read = open('E:\\software\\pyCharmdata\\python_base\\data_7\\bill.txt', mode='r', encoding='utf8')
# 打开文件用于写入
f_write = open('E:\software\\pyCharmdata\\python_base\\data_7\\bill.txt.bak', mode='w', encoding='utf8')
# 操作文件
data = f_read.readlines()
# 定义新的列表用于保存丢弃包含测试数据行之后的列表
new_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()
文件综合案例
数据:
python
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文件
需求:
统计每个人的消费总金额,并将结果写入到文件
示例:
python
# 打开文件用于读取
f_read = open('bill.txt', mode='r', encoding='utf-8')
# 统计每个人的消费总金额,并将结果写入到文件
# 定义字典用于保存每个人的消费总金额
content_dict = {
"周杰轮": 0,
"林俊节": 0,
"张学油": 0,
"王力鸿": 0,
"刘德滑": 0
}
# 操作文件处理数据
lines = f_read.readlines()
# 遍历列表,按行处理数据
for line in lines:
if line.find('消费') != -1:
consume_list = line.split(',')
# consume_list[0]就是当前行的人名
# consume_list[2]就是当前行的消费金额
content_dict[consume_list[0]] += int(consume_list[2])
# content_dict[consume_list[0]] = int(consume_list[3]) + content_dict[consume_list[0]]
print(consume_list)
print(content_dict)
# 将计算结果写入到结果文件中
# 打开文件用于写入
f_write = open('bill.txt.bak', mode='w', encoding='utf8')
# 操作文件
f_write.write(content_dict.__str__())
# 关闭文件
f_write.close()
f_read.close()