前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python文件操作

Python文件操作

原创
作者头像
Heaven645
修改2024-07-27 07:47:24
641
修改2024-07-27 07:47:24
举报
文章被收录于专栏: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的文本文件,并输入如下内容:

代码语言:python
代码运行次数:0
复制
# "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表示要从文件中读取的数据的长度(单位是字节)。

代码语言:python
代码运行次数:0
复制
f=open("D:/test.txt","r",encoding="UTF-8")
# 读取文件——read()
print(f"读取10个字节的结果:{f.read(10)}")

输出结果: 读取10个字节的结果:床前明月光,疑是地上

如果没有传入num,那么就表示读取文件中所有的数据。

代码语言:python
代码运行次数:0
复制
f=open("D:/test.txt","r",encoding="UTF-8")
# 读取文件——read()
print(f"读取全部内容的结果:{f.read()}")

输出结果: 读取全部内容的结果:床前明月光,疑是地上霜。举头望明月,低头思故乡。

连续调用read()方法来读取文件时,每次调用都会从上次读的位置继续往下读取。

代码语言:python
代码运行次数:0
复制
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文本文件中输入如下内容:

代码语言:python
代码运行次数:0
复制
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文本文件中输入如下内容:

代码语言:python
代码运行次数:0
复制
# 读取文件——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() 方法从字符串中去除多余的换行符和其他空白字符。

代码语言:python
代码运行次数:0
复制
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文本文件中输入如下内容:

代码语言:python
代码运行次数:0
复制
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() 关闭文件对象

代码语言:python
代码运行次数:0
复制
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 占用。

代码语言:python
代码运行次数:0
复制
f=open("D:/test.txt","r",encoding="UTF-8")
# 文件的关闭
f.close()
time.sleep(500000)

运行后,可以正常删除test.txt文本文件。

【分析】

通过调用 f.close(),显式地关闭了文件,释放了文件的资源,并通知操作系统该文件不再被程序占用。由于文件已经被关闭,操作系统不再将其标记为“正在使用中”,因此可以正常删除 test.txt 文件。

代码语言:python
代码运行次数:0
复制
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#文件在这里自动关闭

代码语言:python
代码运行次数:0
复制
#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单词出现的次数。

代码语言:python
代码运行次数:0
复制
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次

代码语言:python
代码运行次数:0
复制
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”模式进行写入,常用的方法有以下两种:

  • wirte():写入内容
  • flush():刷新内容到硬盘中

注意

  • w模式:当文件不存在时会创建新文件
  • w模式:当文件存在时会清空原有内容
代码语言:python
代码运行次数:0
复制
# 打开文件
# 如果文件不存在,“w”模式会帮我们创建文件
f=open("D:/test.txt","w",encoding="UTF-8")
f.write("Hello World!")   #内容写入到内存中(即缓冲区中)
# 使程序暂停 500000 秒(约139小时),在此期间程序不会执行任何其他操作。
time.sleep(500000)

双击打开test.txt文本文件,发现内容为空。

这是因为直接调用write方法,内容并未真正写入文件,而是会积攒在程序的内存中(即缓冲区中)。

  • 缓冲区: 在写入文件时,数据可能被保留在缓冲区中,而不是立即写入磁盘
  • 刷新机制: 当调用close 方法或程序结束时,缓冲区的内容会被自动写入文件
  • 手动刷新: 如果需要在不关闭文件的情况下强制将缓冲区的内容写入磁盘,可以手动调用flush方法

这种设计可将数据暂时存储在缓冲区,减少对硬盘的写入次数,提高性能。

代码语言:python
代码运行次数:0
复制
# 打开文件
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方法的功能。

代码语言:python
代码运行次数:0
复制
# 打开文件
f=open("D:/test.txt","w",encoding="UTF-8")
f.write("Hello World!")   #内容写入到内存中
# 关闭文件
f.close()   # close方法,内置了flush功能

双击打开test.txt文本文件,内容为“Hello World!”。

代码语言:python
代码运行次数:0
复制
# 打开文件
f=open("D:/test.txt","w",encoding="UTF-8")
f.write("Hello World!")

但是我们在实践的过程中会发现,编写如上代码,没有调用flush方法也没有调用close方法,但是运行后双击打开test.txt还是会有"Hello World!"的内容。

这是因为如果 Python 程序正常结束,操作系统通常会在程序退出时自动刷新未写入的数据到文件

四、文件的追加

追加写入文件使用open函数的”a”模式进行追加,常用的方法有以下两种:

  • wirte():写入内容
  • flush():刷新内容到硬盘中

注意

  • a模式:当文件不存在时会创建新文件
  • a模式:当文件存在时会在原有内容后面继续写入
  • 可使用\n实现换行
代码语言:python
代码运行次数:0
复制
# 打开文件
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文件作为备份’

代码语言:python
代码运行次数:0
复制
# 打开文件得到文件对象,准备读取
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、文件的编码
  • 二、文件的读取
    • 1.打开文件
      • 2.读取文件
        • 3.关闭文件
        • 三、文件的写入
        • 四、文件的追加
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档