Bootstrap

Python文件操作

文件的编码

文件编码

思考:计算机只能识别: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函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下

open(name,mode,encoding)

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。

mode:设置打开文件的模式(访问模式):只读、写入、追加等。

encoding:编码格式(推荐使用UTF-8)

示例代码:

f = open('python.txt','r',encoding='UTF-8')
# encoding的顺序不是第三位,所有不能用位置参数,用关键字参数直接指定

注意:此时的`f`是`open`函数的文件对象,对象是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()

文件的路径 

示例:

# 绝对路径
# 定义文件路径
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()方法:

文件对象.read(num)

num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

readlines()方法:

readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

f = open('python.txt')
content = f.readlines()

# ['hello world\n','abcdefg\n','aaa\n','bbb\n','ccc']
print(content)

# 关闭文件
f.close()

readline()方法:一次读取一行内容

f = open('python.txt')

content = f.readline()
print(f'第一行:{content}')

content = f.readline()
print(f'第二行:{content}')

# 关闭文件
f.close()

for循环读取文件行

for line in open("python.txt","r"):
    print(line)

# 每一个line临时变量,就记录了文件的一行数据

close() 关闭文件对象

f = open("python.txt","r")

f.close()

# 最后通过close,关闭文件对象,也就是关闭对文件的占用
# 如果不调用close,同时程序没有停止运行,那么这个文件将一直被Python程序占用。

with open 语法

with open("python.txt","r") as f:
    f.readlines()

# 通过在with open的语句块对文件进行操作
# 可以在操作完成后自动关闭close文件,避免遗忘掉close方法
示例
  •  read()方式读取文件内容

# # 以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()
  • 按行读取文件内容

# # 以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()语法打开文件

# 使用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语法打开文件,可以自动关闭

总结

1. 操作文件需要通过open函数打开文件得到文件对象

2. 文件对象有如下读取方法:

read()

readline()

readlines()

for line in 文件对象

3. 文件读取完成后,要使用文件对象.close()方法关闭文件对象,否则文件会被一直占用

文件的定义:文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别

操作的步骤:

  • 1-打开文件

  • 2-读写文件

  • 3-关闭文件

文件的写入

写操作快速入门

案例演示:

# 1.打开文件
f = open('python.txt','w')

# 2.文件写入
f.write('hello world')\

# 3.内容刷新
f.flush()

注意:

直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区

当调用flush的时候,内容会真正写入文件

这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)

写操作注意

文件如果不存在,使用”w”模式,会创建新文件

文件如果存在,使用”w”模式,会将原有内容清空

示例

  • write()一个个写入

# 以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()一行行写入

# 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模式,文件不存在会创建新,文件如果存在,不会清空内容会追加写入文件

  • close()方法,带有flush()方法的功能

文件的追加

追加写入操作快速入门

案例演示:

# 1.打开文件,通过a模式打开即可
f = open('python.txt','a')

# 2.文件写入
f.write('hello world')

# 3.内容刷新
f.flush()

注意: a模式,文件不存在会创建文件 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文件

需求:

我们现在要做的就是:

        读取文件

        将文件写出到bill.txt.bak文件作为备份

        同时,将文件内标记为测试的数据行丢弃

实现思路:

        open和r模式打开一个文件对象,并读取文件

        open和w模式打开另一个文件对象,用于文件写出

        for循环内容,判断是否是测试不是测试就write写出,是测试就continue跳过

        将2个文件对象均close()

示例:

# 打开文件用于读取
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()

 文件综合案例

 数据:

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文件

需求:

统计每个人的消费总金额,并将结果写入到文件

示例:

# 打开文件用于读取
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()
;