Chapter 16 Python文件操作(上)

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!


前言

Python作为一种高效且易于学习的编程语言,提供了一系列强大的文件操作功能,使得用户能够轻松地实现文件的读取、写入和管理。本章将详细讲解文件的编码以及读取操作。


本篇文章参考:黑马程序员

一、文件的编码

思考:计算机只能识别0和1,那么我们丰富的文本文件是如何被计算机识别并存储在硬盘中呢?
答案:使用编码技术(密码本)将内容翻译成0和1存入。

编码技术,即翻译的规则,记录了内容和二进制间进行相互转换的逻辑。
在这里插入图片描述
计算机中存在多种编码格式,如UTF-8、GBK和Big5等。这些编码将文本内容转换为二进制数据,不同的编码会产生不同的二进制表示,因此在进行文件读写操作时,使用正确的编码非常重要。UTF-8作为一种全球通用的编码格式,因其兼容性和灵活性,已成为互联网和现代应用中最广泛采用的编码方式。

二、文件的读取

内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,计算机引入了“文件”的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
在这里插入图片描述
在日常生活中,文件操作主要包括打开、关闭、读、写等操作。我们平常对文件的基本操作大概可以分为打开文件、读写文件、关闭文件这三个步骤 。
在这里插入图片描述

1.打开文件

open()打开函数:
在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。

基本语法:
open(name,mode,encoding)

  • name:指定了要打开的文件的完整路径或相对路径(可包含文件的目录、文件名以及文件扩展名)
  • mode:设置打开文件的访问模式(只读、写入、追加等)
    在这里插入图片描述
  • encoding:编码格式(推荐使用UTF-8)

在电脑的D盘中新建一个test.txt的文本文件,并输入如下内容:
在这里插入图片描述

# "D:/test.txt" 是test.txt的文本文件的绝对路径
f=open("D:/test.txt","r",encoding="UTF-8")
print(type(f))

<class ‘_io.TextIOWrapper’>

注意:

  • 此时的fopen函数的文件对象,对象是Python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性对象.方法对其进行访问
  • Python中open函数的参数签名通常为open(name, mode='r', buffering=-1, encoding=None,errors=None,newline=None, closefd=True, opener=None)
    由于encoding参数不是open函数的第三个位置参数,所以不能使用位置参数传递,需用关键字参数直接指定,以避免潜在的混淆和错误
  • <class '_io.TextIOWrapper'>是 Python 中一个类的表示形式,表示当前对象是一个文本文件的包装器

2.读取文件

①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

3.关闭文件

①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 文件对象:
  # 在这里进行文件操作
  …
#文件在这里自动关闭

#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次

  • 34
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值