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函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下

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

总结

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

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

read()

readline()

readlines()

for line in 文件对象

  1. 文件读取完成后,要使用文件对象.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()
相关推荐
Bruce-li__2 分钟前
django解决跨域问题
后端·python·django
qq_2739002320 分钟前
pytorch torch.isclose函数介绍
人工智能·pytorch·python
生信与遗传解读1 小时前
XGBoost算法在自定义数据集中预测疾病风险
人工智能·python·算法·数据分析
人生无根蒂,飘如陌上尘3 小时前
网站自动签到
python·签到
深图智能3 小时前
OpenCV的双边滤波函数
python·opencv·计算机视觉
eybk3 小时前
采用pycorrector纠错word文件段落,并保存为word文件标红显示出来
python·word
背锅浩3 小时前
python批量删除redis key
redis·python·bootstrap
范纹杉想快点毕业3 小时前
XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传
xml·c语言·开发语言·数据结构·c++·python·c#
黑客老陈3 小时前
BaseCTF scxml 详解
开发语言·网络·python·sql·安全·web安全
Ma_si4 小时前
python 如何调整word 文档页眉页脚
python·c#·word