Python作为一种高效且易于学习的编程语言,提供了一系列强大的文件操作功能,使得用户能够轻松地实现文件的读取、写入和管理。本章将详细讲解文件的编码以及读取、写入和追加操作。
本篇文章参考:黑马程序员
思考:计算机只能识别0和1,那么我们丰富的文本文件是如何被计算机识别并存储在硬盘中呢?
答案:使用编码技术(密码本)将内容翻译成0和1存入。
编码技术,即翻译的规则,记录了内容和二进制间进行相互转换的逻辑。
计算机中存在多种编码格式,如UTF-8、GBK和Big5等。这些编码将文本内容转换为二进制数据,不同的编码会产生不同的二进制表示,因此在进行文件读写操作时,使用正确的编码非常重要。UTF-8作为一种全球通用的编码格式,因其兼容性和灵活性,已成为互联网和现代应用中最广泛采用的编码方式。
内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,计算机引入了“文件”的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
在日常生活中,文件操作主要包括打开、关闭、读、写等操作。我们平常对文件的基本操作大概可以分为打开文件、读写文件、关闭文件这三个步骤 。
open()打开函数:
在Python,使用open
函数,可以打开一个已经存在的文件,或者创建一个新文件。
基本语法: open(name,mode,encoding)
在电脑的D盘中新建一个test.txt的文本文件,并输入如下内容:
# "D:/test.txt" 是test.txt的文本文件的绝对路径
f=open("D:/test.txt","r",encoding="UTF-8")
print(type(f))
<class '_io.TextIOWrapper'>
注意:
f
是open
函数的文件对象,对象是Python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性或对象.方法对其进行访问open
函数的参数签名通常为open(name, mode='r', buffering=-1, encoding=None,errors=None,newline=None, closefd=True, opener=None)
由于encoding
参数不是open
函数的第三个位置参数,所以不能使用位置参数传递,需用关键字参数直接指定,以避免潜在的混淆和错误<class '_io.TextIOWrapper'>
是 Python 中一个类的表示形式,表示当前对象是一个文本文件的包装器①read()方法:
基本语法: 文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节)。
f=open("D:/test.txt","r",encoding="UTF-8")
# 读取文件——read()
print(f"读取10个字节的结果:{f.read(10)}")
输出结果: 读取10个字节的结果:床前明月光,疑是地上
如果没有传入num,那么就表示读取文件中所有的数据。
f=open("D:/test.txt","r",encoding="UTF-8")
# 读取文件——read()
print(f"读取全部内容的结果:{f.read()}")
输出结果: 读取全部内容的结果:床前明月光,疑是地上霜。举头望明月,低头思故乡。
连续调用read()方法来读取文件时,每次调用都会从上次读的位置继续往下读取。
f=open("D:/test.txt","r",encoding="UTF-8")
# 读取文件——read()
print(f"读取10个字节的结果:{f.read(10)}")
print(f"读取全部内容的结果:{f.read()}")
输出结果: 读取10个字节的结果:床前明月光,疑是地上 读取全部内容的结果:霜。举头望明月,低头思故乡。
【分析】
第一次调用read():
f.read(10) 文件指针会从文件的开头读取10个字节,并将文件指针移动到第11个字节处,即读取“床前明月光,疑是地上”。
第二次调用read():
它将从文件指针当前位置(即第11个字节)开始读取,直到文件结束。因此f.read() 会读取从当前文件指针位置到文件末尾的所有内容“霜。 举头望明月,低头思故乡。”
②readlines()方法:
基本语法: 文件对象.readlines()
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
在test.txt文本文件中输入如下内容:
f=open("D:/test.txt","r",encoding="UTF-8")
# 读取文件——readlines():读取文件全部行,封装到列表中
lines=f.readlines()
print(f"lines对象的类型:{type(lines)}")
print(f"lines对象的内容:{lines}")
输出结果: lines对象的类型:<class 'list'> lines对象的内容:'床前明月光,疑是地上霜。举头望明月,低头思故乡。\n', '111,222,333,444,555\n', 'aaabbbccc'
在文本文件中,不同的行是通过换行符\n
来分隔的。当你在文本编辑器中输入文本并按下 Enter 键时,实际上是在文本中插入了一个换行符。使用 readlines() 方法从文件中读取所有行时,每行的内容也包括结束时的换行符\n
。
③readline()方法:
一次读取一行内容。
基本语法: 文件对象.readline()
在test.txt文本文件中输入如下内容:
# 读取文件——readline():一次读取一行内容
f=open("D:/test.txt","r",encoding="UTF-8")
line1=f.readline()
line2=f.readline()
print(f"第一行数据:{line1}")
print(f"第二行数据:{line2}")
输出结果: 第一行数据:床前明月光,疑是地上霜。举头望明月,低头思故乡。 第二行数据:111,222,333,444,555
使用 readline() 方法读取文件时,返回的每一行都包含行末的换行符\n
。当你打印输出时,行末的换行符\n
会导致内容之间多出一个空行。
为了避免这种情况,可以在打印时使用 strip() 方法从字符串中去除多余的换行符和其他空白字符。
f=open("D:/test.txt","r",encoding="UTF-8")
line1=f.readline()
line2=f.readline()
print(f"第一行数据:{line1.strip()}")
print(f"第二行数据:{line2.strip()}")
输出结果: 第一行数据:床前明月光,疑是地上霜。举头望明月,低头思故乡。 第二行数据:111,222,333,444,555
④for循环读取文件行:
在test.txt文本文件中输入如下内容:
f=open("D:/test.txt","r",encoding="UTF-8")
# for循坏读取文件行
# 每一个line临时变量,就记录了文件的一行数据
i=0
for line in f:
i+=1
print(f"第{i}行数据:{line.strip()}")
输出结果: 第1行数据:床前明月光,疑是地上霜。举头望明月,低头思故乡。 第2行数据:111,222,333,444,555 第3行数据:aaabbbccc
①close语法:
基本语法: close() 关闭文件对象
f=open("D:/test.txt","r",encoding="UTF-8")
# 调用 time 模块中的 sleep 函数,用于让程序暂停执行一段时间
# 500000 是暂停的时间,单位是秒
time.sleep(500000)
运行该段代码,发现test.txt文本文件不能被删除或者重命名,并且显示test.txt文本文件正在被Python占用。
【分析】
在调用 time.sleep(500000) 之前,文件 test.txt 处于打开状态。由于文件在打开后没有被关闭,所以操作系统将该文件标记为“正在使用中”。此时操作系统会阻止对文件的删除操作,防止数据损坏以及不一致性。因此,无法删除 test.txt 文件,系统会提示该文件正在被 Python 占用。
f=open("D:/test.txt","r",encoding="UTF-8")
# 文件的关闭
f.close()
time.sleep(500000)
运行后,可以正常删除test.txt文本文件。
【分析】
通过调用 f.close(),显式地关闭了文件,释放了文件的资源,并通知操作系统该文件不再被程序占用。由于文件已经被关闭,操作系统不再将其标记为“正在使用中”,因此可以正常删除 test.txt 文件。
f = open("D:/test.txt", "r", encoding="UTF-8")
f.close()
time.sleep(500000)
运行该段代码,发现test.txt文本文件不能被删除或者重命名,并且显示test.txt文本文件正在被Python占用。
【分析】
time.sleep(500000)使程序暂停大约139小时(500000秒)。在这段时间内文本文件 test.txt 会处于打开状态。只有在 time.sleep(500000) 完成后,程序才会继续执行并调用 f.close(),此时文件才会被关闭。
②with open语法:
通过在with open的语句块中对文件进行操作,可以在操作完成后自动关闭close文件,避免遗忘掉close方法。
基本语法: with open("文件路径","模式") as 文件对象:undefined # 在这里进行文件操作undefined ...undefined#文件在这里自动关闭
#with open语法操作文件:执行完后自动将文件关闭
with open("D:/test.txt","r",encoding="UTF-8") as f:
for line in f:
print(f"每一行数据:{line}")
time.sleep(500000)
运行后,可以正常删除test.txt文本文件。
【例题】
通过Windows的文本编辑器软件,将如下内容复制并保存到test.txt文本文件中,文件可以存储在任意位置。通过文件读取操作读取此文件,统计itheima单词出现的次数。
f=open("D:/test.txt","r",encoding="UTF-8")
# 方式一:读取全部内容,通过字符串count方法统计apple单词数量
content=f.read()
num=content.count("apple")
print(f"apple出现了{num}次")
# 关闭文件
f.close()
输出结果: apple出现了2次
f=open("D:/test.txt","r",encoding="UTF-8")
# 方式二:一行行地读取内容
count=0 # 使用count变量来累计apple出现的次数
for line in f:
# 通过strip方法去除换行符
line=line.strip()
# 通过split方法按空格切分
words=line.split(" ")
for word in words:
if word=="apple":
# 进行数量的累加
count+=1
print(f"apple出现了{count}次")
# 关闭文件
f.close()
输出结果: apple出现了2次前言
Python作为一种高效且易于学习的编程语言,提供了一系列强大的文件操作功能,使得用户能够轻松地实现文件的读取、写入和管理。本章将详细讲解文件的写入以及追加操作。
本篇文章参考:黑马程序员
写入文件使用open
函数的”w”模式进行写入,常用的方法有以下两种:
注意:
# 打开文件
# 如果文件不存在,“w”模式会帮我们创建文件
f=open("D:/test.txt","w",encoding="UTF-8")
f.write("Hello World!") #内容写入到内存中(即缓冲区中)
# 使程序暂停 500000 秒(约139小时),在此期间程序不会执行任何其他操作。
time.sleep(500000)
双击打开test.txt文本文件,发现内容为空。
这是因为直接调用write
方法,内容并未真正写入文件,而是会积攒在程序的内存中(即缓冲区中)。
close
方法或程序结束时,缓冲区的内容会被自动写入文件flush
方法这种设计可将数据暂时存储在缓冲区,减少对硬盘的写入次数,提高性能。
# 打开文件
f=open("D:/test.txt","w",encoding="UTF-8")
f.write("Hello World!") #内容写入到内存中
# flush刷新
f.flush() #将内存中积攒的内容,写入到硬盘文件中
time.sleep(500000)
双击打开test.txt文本文件,内容为“Hello World!”。
除此之外,close
方法内置了flush
方法的功能。
# 打开文件
f=open("D:/test.txt","w",encoding="UTF-8")
f.write("Hello World!") #内容写入到内存中
# 关闭文件
f.close() # close方法,内置了flush功能
双击打开test.txt文本文件,内容为“Hello World!”。
# 打开文件
f=open("D:/test.txt","w",encoding="UTF-8")
f.write("Hello World!")
但是我们在实践的过程中会发现,编写如上代码,没有调用flush
方法也没有调用close
方法,但是运行后双击打开test.txt还是会有"Hello World!"的内容。
这是因为如果 Python 程序正常结束,操作系统通常会在程序退出时自动刷新未写入的数据到文件。
追加写入文件使用open
函数的”a”模式进行追加,常用的方法有以下两种:
注意:
\n
实现换行# 打开文件
f=open("D:/test.txt","a",encoding="UTF-8")
# write写入
f.write("Hello python!")
# 换行写入
f.write("\nHello everyone!")
# close关闭
f.close()
双击打开test.txt文本文件,内容如下:
【例题】
有一份账单文件,记录了消费收入的具体记录,内容如下:
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文件并满足以下要求:
1.读取文件;
2.将文件内标记为测试的数据行丢弃;
3.将文件写出到bill.txt.bak文件作为备份’
# 打开文件得到文件对象,准备读取
fr= open("D:/bill.txt", "r", encoding="UTF-8")
# 打开文件得到文件对象,准备写入
fw= open("D:/bill.txt.bak", "w", encoding="UTF-8")
# for循坏读取文件
for line in fr:
# 通过strip方法去除换行符
line=line.strip()
# 通过split方法按逗号切分,通过下标[4]得到remarks的内容
if line.split(",")[4]=="测试":
continue #进入下一次循坏,后面的内容跳过
# 将内容写出去
fw.write(line)
# 由于前面对内容进行了strip()的操作去除了换行符
# 所以要手动加上换行符
fw.write("\n")
# 关闭文件
fr.close()
fw.close()
运行后双击打开bill.txt.bak文件,文件内容如下:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。