Python基础:文件的读写

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


大家好!在Python编程中,文件的读写操作是非常基础且重要的一部分。无论是存储数据、读取配置文件,还是记录日志,文件操作都扮演着关键角色。本文将带你深入了解Python中如何高效、安全地进行文件读写操作,帮助你全面掌握这一重要的编程技能。

一、文件操作的重要性

1.1 什么是文件操作?

文件操作指的是在程序中对文件进行读取、写入、修改和删除的过程。通过文件操作,程序可以持久化存储数据,实现数据的长期保存和共享。

用途:

  • 数据持久化存储:保存程序运行时生成的数据,确保数据在程序结束后仍然存在。

  • 配置文件管理:读取和修改程序的配置参数,方便程序的个性化设置。

  • 日志记录:记录程序的运行状态、错误信息和调试信息,便于问题排查和性能优化。

  • 数据交换与通信:在不同程序或系统之间传递数据,实现数据的共享和交互。

1.2 文件操作的应用场景

文件操作在实际开发中有着广泛的应用场景,包括但不限于:

  • 数据存储与管理:保存用户数据、程序生成的数据等。

  • 配置管理:读取和修改程序的配置文件,支持动态配置。

  • 日志记录:记录程序的运行日志、错误日志,便于监控和调试。

  • 数据分析:处理和分析存储在文件中的数据,如CSV、JSON等格式的数据。

  • 备份与恢复:定期备份重要文件,确保数据安全和可恢复性。

二、文件相关的基本概念

2.1 文件类型

2.1.1 文本文件

存储可读的字符数据,如 .txt.csv.json.xml 等。

CSV(Comma-Separated Values,逗号分隔值):一种表格数据格式,每行是一条记录,字段之间用逗号(,)分隔,类似 Excel,但只存文本。适用于简单结构化数据存储。

JSON(JavaScript Object Notation):一种轻量级数据交换格式,使用 键值对(类似 Python 字典)和 数组 组织数据,结构清晰,可读性强,广泛用于前后端数据交互

XML(Extensible Markup Language,可扩展标记语言):类似 HTML,用标签来组织数据,适用于层次结构(树状)数据,但比 JSON 更冗长,常用于配置文件、文档存储等。

2.1.2 二进制文件

存储非字符数据,如图片、音频、视频、可执行文件等。

二进制文件(Binary File) 是计算机直接存储二进制数据(0 和 1)的文件,与普通的文本文件(Text File)不同,它不能直接用文本编辑器打开和阅读。

2.2 文件路径

  • 绝对路径:是指从系统根目录(Windows: C:\,Linux/macOS: /)开始,完整地指定文件或文件夹的位置,无论当前在哪个目录,都能唯一确定该文件的位置。如 /home/user/documents/data.txt

  • 相对路径:指相对于当前工作目录(程序运行的起点)来指定文件或文件夹的位置,而不是从系统根目录开始。

    比如./data.txt代表当前目录下的data.txt../config/settings.json代表上一级目录的 config 文件夹内 settings.json

2.3 文件模式

在 Python 中,打开文件时需要指定文件模式,不同模式决定了如何读写文件:

2.3.1 读取模式 ('r')

只读模式,文件必须存在,否则报错。

2.3.2 写入模式 ('w')

写入模式,会清空原文件内容;如果文件不存在,会创建新文件。

2.3.3 追加模式 ('a')

在文件末尾追加内容,不会清空原内容;文件不存在时会创建新文件。

2.3.4 二进制模式 ('b')

用于处理图片、音频、视频等非文本文件,可以与其他模式组合使用,如 'rb'(二进制读取)、'wb'(二进制写入)。

2.3.5 读写模式 ('r+''w+''a+')

'r+':同时读+写,不会清空文件,文件必须存在。

'w+':同时写+读,但会清空原文件,文件不存在时会创建。

'a+':同时追加+读,不会清空文件,文件不存在时会创建。

2.4 文件指针

文件指针(File Pointer) 是文件内部的“光标”,指示当前读写的位置。当我们打开文件时,文件指针默认在文件开头,每次读取或写入后,指针都会移动

文件指针的特点

  • 默认在文件开头,除非使用追加模式('a'),则指针在文件末尾。

  • 读取后,指针向前移动,不会重新回到开头。

  • 写入时,指针决定数据写入的位置

  • 可以使用 seek() 手动调整指针位置

2.5 文件编码

文件编码(Encoding) 指的是如何在文件中存储文本数据。不同编码方式决定了字符如何转换成二进制数据,影响文件的正确读取和显示。

常见编码格式

  • UTF-8(默认编码):支持多种语言字符,通用且推荐使用。

  • GBK:适用于简体中文文件,部分旧系统仍在使用。

  • ASCII:只支持英文和基本符号,无法存储中文。

Python 默认使用 UTF-8,但如果遇到乱码,可以尝试 encoding="gbk" 或其他编码。

三、文件的基本读写操作

3.1 打开与关闭文件

3.1.1 打开文件——open()方法

在 Python 中,open() 方法用于打开文件,并返回一个文件对象,允许我们读取、写入或修改文件内容

open()方法语法结构如下:

file = open("文件路径", "模式", encoding="编码格式")
  • 文件路径:要打开的文件名或路径(如 "example.txt")。

  • 模式(可选):指定文件的打开方式(如只读 'r',写入 'w')。

  • encoding(可选):用于指定文本编码,一般使用 "utf-8" 处理中文。

file = open('Python读写测试.txt', 'r', encoding='utf-8')  # 读取一个文本文件
lines = file.readlines()  # 读取文件
print(lines)
# 输出
['这个文件用来测试Python的文件读写操作。']

注意:上面的这个示例代码其实少了一个关闭文件的操作,在编程中我们打开一个文件后,要记得对文件进行关闭操作,否则会导致某些错误。

3.1.2 关闭文件——close()方法

在 Python 进行文件操作时,使用 open() 打开的文件需要手动关闭,否则可能会导致资源泄露。close() 方法就是用来关闭文件的。close() 关闭文件后,该文件对象不能再被读取或写入,否则会报错。

file = open('Python读写测试.txt', 'r', encoding='utf-8')  # 读取一个文本文件
lines = file.readlines()  # 读取文件
print(lines)
file.close()  # 关闭文件
lines = file.readlines()  # 关闭后读取文件
# 输出
['这个文件用来测试Python的文件读写操作。']
# 报错
ValueError: I/O operation on closed file.

为什么要使用close()?

  • 释放系统资源:打开文件会占用计算机资源,关闭文件可以释放资源,提高程序运行效率。

  • 防止数据丢失:如果写入数据后没有及时 close(),可能导致数据未保存完整。

  • 避免错误:如果文件未关闭,其他程序可能无法访问它。

3.1.3 推荐的文件打开与关闭方法

Python 推荐使用 with open()来对文件进行操作,它能自动关闭文件,无需手动调用 close()

with open('Python读写测试.txt', 'r', encoding='utf-8') as file:  # 读取一个文本文件
    lines = file.readlines()  # 读取文件
    print(lines)
# 输出
['这个文件用来测试Python的文件读写操作。']

3.2 文件的读取

3.2.1 读取整个文件——read()方法

一次性读取整个文件内容,适用于小型文件。

特点

  • 适合小文件(文件太大会占用大量内存)。

  • 读取后文件指针到达文件末尾,再次 read() 会返回 ''(空字符串)。

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    content = file.read()  # 读取整个文件
    print(content)
    content_2 = file.read()  # 再次读取,此时文件指针已经在文件末尾,所以读取不到内容
    print(f"content_2: {content_2}") 
# 输出
这个文件用来测试Python的文件读写操作。
这是第二行
这是第三行
这是第四行
content_2: 
3.2.2 读取指定字节数——read(size) 方法

只读取文件的一部分,而不是整个文件。

特点

  • 适用于大文件,可以分批读取,节省内存。

  • 每次读取后,文件指针会向前移动,下一次 read(10) 读取下 10 个字符。

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    content = file.read(10)  # 读取前10个字符
    print(content)
    content = file.read(10)  # 再读取10个字符
    print(content)
# 输出
这个文件用来测试Py
thon的文件读写操
3.2.3 读取一行——readline() 方法

只读取文件的第一行,或逐行读取文件。

特点

  • 适合处理结构化文本(如 CSV、日志文件)。

  • 每次调用 readline(),都会读取下一行

  • 末尾带有换行符 \n(如果文件里有)。

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    line1 = file.readline()  # 读取第一行
    print(line1)
    line2 = file.readline()  # 读取第二行
    print(line2)
# 输出
这个文件用来测试Python的文件读写操作。

这是第二行
3.2.4 读取所有行并返回列表——readlines() 方法

一次性读取所有行,并以列表(list)形式返回。

特点

  • 适合需要按行处理的场景

  • lines[0] 是第一行,lines[1] 是第二行。

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    lines = file.readlines()  # 读取所有行
    print(lines)
# 输出
['这个文件用来测试Python的文件读写操作。\n', '这是第二行\n', '这是第三行\n', '这是第四行']
3.2.5 使用 for 循环逐行读取(推荐大文件)

高效读取大文件,不会一次性占用大量内存。

特点

  • 最节省内存,适合大文件。

  • 逐行处理,不会一次性加载整个文件。

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(line.strip())  # 去除换行符
# 输出
这个文件用来测试Python的文件读写操作。
这是第二行
这是第三行
这是第四行

3.3 文件的写入

3.3.1 写入字符串——write() 方法

向文件写入字符串,可用于创建新文件或覆盖已有文件

with open("Python读写测试.txt", "w", encoding="utf-8") as file:
    file.write("这是覆盖写入的一行")

with open("Python读写测试.txt", "a", encoding="utf-8") as file:
    file.write("\n这是追加写入的一行")  # \n是为了添加换行符

# 打印文件内容
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(line.strip())  # 去除换行符

with open("Python读写测试.txt", "w", encoding="utf-8") as file:
    file.write("这是重新覆盖写入的一行")  # \n是为了添加换行符

# 打印文件内容
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    for line in file:
        print(line.strip())  # 去除换行符
# 输出
这是覆盖写入的一行
这是追加写入的一行
这是重新覆盖写入的一行

特点

  • 如果文件不存在,会自动创建

  • 如果文件存在,会清空原内容再写入。

  • 只能写入字符串,对于其他类型的数据需要先转换成字符串

    with open("Python读写测试.txt", "w", encoding="utf-8") as file:
        a_list = [1, 2, 3, 4, 5]
        file.write(a_list)  # 报错,因为write方法只接受字符串
    
    TypeError: write() argument must be str, not list
    
3.3.2 写入多行——writelines() 方法

一次性写入多个字符串,通常用于写入列表数据writelines() 需要手动**添加换行符 \n**,否则所有内容会连在一起。

lines = ["第一行\n", "第二行\n", "第三行\n"]

with open("Python读写测试.txt", "w", encoding="utf-8") as file:
    file.writelines(lines)  # 写入多行

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)
# 输出
第一行
第二行
第三行

lines = ["第一行", "第二行", "第三行"]

with open("Python读写测试.txt", "w", encoding="utf-8") as file:
    file.writelines(lines)  # 写入多行

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)
# 输出
第一行第二行第三行
3.3.3 向文件末尾追加内容——追加模式('a')

不清空原文件,而是在文件末尾继续写入

with open("Python读写测试.txt", "w", encoding="utf-8") as file:
    file.write("原始内容\n")

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)

with open("Python读写测试.txt", "a", encoding="utf-8") as file:
    file.write("追加内容\n")

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)
# 输出
原始内容

原始内容
追加内容

特点

  • 不会清空原内容,而是追加到文件末尾。

  • 文件不存在时,会自动创建

3.3.4 读写模式('r+'、'w+'、'a+')

'r+'模式:

  • 读写模式:文件既可以读取也可以写入。

  • 文件必须存在:如果文件不存在,会抛出 FileNotFoundError

  • 文件指针在文件开头:打开文件后,文件指针位于文件的开头。

with open("Python读写测试.txt", "w", encoding="utf-8") as file:
    file.write("原始内容\n")

with open("Python读写测试.txt", "r+", encoding="utf-8") as file:
    raw_content = file.read()  # 可以读取文件,也可以写入文件
    print(raw_content)
    file.write("追加内容\n")

with open("Python读写测试.txt", "r", encoding="utf-8") as file:
    print(file.read())
# 输出
原始内容

原始内容
追加内容

上面的代码看起来好像r+模式是追加的而不是覆盖原来的内容,但其实不是这样的。注意到我们以r+模式读写的时候,先是读取了以下文件原来的内容,结合先前介绍的文件指针的概念,此时文件指针其实已经移动到文件的末尾了,我们写入新内容的时候是在文件指针的位置写入的,所以看起来像是追加一样。

# 以 r+ 模式向不存在的文件写入内容
with open("不存在的文件.txt", "r+", encoding="utf-8") as file:
    file.write("写入内容\n")
# 报错
FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt'

'w+'模式:

  • 读写模式:文件既可以读取也可以写入。

  • 文件不存在时创建文件:如果文件不存在,会创建一个新文件。

  • 清空文件内容:如果文件存在,打开文件时会清空文件的内容。

  • 文件指针在文件开头:打开文件后,文件指针位于文件的开头。

# 以 w+ 模式向不存在的文件写入内容
with open("不存在的文件.txt", "w+", encoding="utf-8") as file:
    file.write("以w+模式向不存在的文件写入内容,会自动创建文件\n")

with open("不存在的文件.txt", "r", encoding="utf-8") as file:
    print(file.read())
# 输出
以w+模式向不存在的文件写入内容,会自动创建文件

with open("不存在的文件.txt", "w+", encoding="utf-8") as file:
    file.write("以w+模式向不存在的文件写入内容,会自动创建文件\n")

with open("不存在的文件.txt", "w+", encoding="utf-8") as file:
    print("什么也不做,但是文件原来的内容会被清空")

with open("不存在的文件.txt", "r+", encoding="utf-8") as file:
    print(f"文件内容:{file.read()}")
    print("被清空了所以什么都没有")
# 输出
什么也不做,但是文件原来的内容会被清空
文件内容:
被清空了所以什么都没有

'a+'模式:

  • 读写模式:文件既可以读取也可以写入。

  • 文件不存在时创建文件:如果文件不存在,会创建一个新文件。

  • 文件指针在文件末尾:打开文件后,文件指针位于文件的末尾。

  • 追加模式:所有写入操作都会在文件末尾进行,不会覆盖文件的现有内容。

with open("a+模式创建不存在的文件.txt", "a+", encoding="utf-8") as file:
    file.write("以a+模式向不存在的文件写入内容,会自动创建文件\n")

with open("a+模式创建不存在的文件.txt", "a+", encoding="utf-8") as file:
    file.write("文件指针位于文件末尾,所以这行内容会追加到文件末尾\n")

with open("a+模式创建不存在的文件.txt", "r+", encoding="utf-8") as file:
    content = file.read()
    print(content)
# 输出
以a+模式向不存在的文件写入内容,会自动创建文件
文件指针位于文件末尾,所以这行内容会追加到文件末尾

四、实战示例

4.1 复制一个文本文件

作为一个小示例,我们来写个脚本,把 source.txt 的内容复制到 dest.txt,如果没内容则创建新的 dest.txt

defcopy_file(source, destination):
    with open(source, "r", encoding="utf-8") as src:
        content = src.read()

    with open(destination, "w", encoding="utf-8") as dst:
        dst.write(content)

# 使用
copy_file("source.txt", "dest.txt")
  • 第一次用 read() 读完所有数据;

  • 第二次用 write() 把数据写到目标文件;

  • 用 w 会覆盖或新建dest.txt

4.2 统计小说中的词频

以网络小说《斗破苍穹》为例,我们试着统计一下在《斗破苍穹》中字和恐怖如斯一共出现了多少次?

file_name = '斗破苍穹.txt'
with open(file_name, 'r', encoding='utf-8') as file:
    # 逐行读取
    lines = file.readlines()
    count = 0
    count_2 = 0
    for line in lines:
        for word in line:
            if word == '桀':
                count += 1
        if'恐怖如斯'in line:
            count_2 += 1
    print("在《斗破苍穹》中:")
    print('恐怖如斯出现了{}次'.format(count_2))
    print('桀字出现了{}次'.format(count))
# 输出
在《斗破苍穹》中:
恐怖如斯出现了25次
桀字出现了567次

五、常见错误及注意事项

5.1 文件未找到 (FileNotFoundError)

错误原因:尝试读取一个不存在的文件。

file = open("不存在的文件.txt", "r")  # 报错:FileNotFoundError

解决方案

确认文件是否存在,可以用 os.path.exists() 先检查:

import os
if os.path.exists("不存在的文件.txt"):
    with open("不存在的文件.txt", "r") as file:
        print(file.read())
else:
    print("文件不存在")

os.path.exists() 方法可以检查给定路径的文件是否存在

5.2 忘记关闭文件

错误原因:手动 open() 打开文件后,忘记 close(),可能导致资源泄露。

file = open("example.txt", "r")
content = file.read()
# 忘记 file.close()

解决方案

推荐使用 with open() 语法,自动关闭文件

with open("example.txt", "r") as file:
    content = file.read()

5.3 读写模式错误 (IOError 或 UnsupportedOperation)

错误原因:使用错误的模式(如 'r' 模式尝试写入文件)。

with open("example.txt", "r") as file:
    file.write("New data")  # 报错:io.UnsupportedOperation: not writable

解决方案

想写入数据,必须使用 'w''a' 或 'r+' 模式

5.4 读取大文件导致内存溢出

错误原因:用 read() 读取超大文件,导致内存占用过高。

with open("large_file.txt", "r") as file:
    content = file.read()  # 可能导致内存不足

解决方案

使用 for line in file 逐行读取,减少内存占用

with open("large_file.txt", "r") as file:
    for line in file:
        print(line.strip())  # 逐行处理

或使用 read(size) 读取指定大小的内容

with open("large_file.txt", "r") as file:
    chunk = file.read(1024)  # 每次读取 1KB
    while chunk:
        print(chunk)
        chunk = file.read(1024)

5.5 文件指针位置错误

错误原因:多次 read() 后,文件指针已经到了文件末尾,导致读取不到数据。

with open("example.txt", "r") as file:
    print(file.read())  # 读取整个文件
    print(file.read())  # 这里会返回空字符串

解决方案:使用 seek(0) 重置文件指针

with open("example.txt", "r") as file:
    print(file.read())  # 读取文件
    file.seek(0)  # 让指针回到开头
    print(file.read())  # 重新读取

5.6 乱码 (UnicodeDecodeError)

错误原因:读取文件时未正确指定编码格式,导致 Python 无法解码。

with open("chinese.txt", "r") as file:
    content = file.read()  # 可能报错:UnicodeDecodeError

解决方案:指定正确的编码格式(推荐 utf-8

with open("chinese.txt", "r", encoding="utf-8") as file:
    content = file.read()

如果编码不确定,可以使用 errors="ignore" 忽略错误

with open("chinese.txt", "r", encoding="utf-8", errors="ignore") as file:
    content = file.read()

5.7 write() 忘记 \n 导致内容连在一起

错误原因write() 方法不会自动换行。

with open("example.txt", "w") as file:
    file.write("Hello")
    file.write("Python")
# 文件内容变成:HelloPython

解决方案:手动添加 \n

with open("example.txt", "w") as file:
    file.write("Hello\n")
    file.write("Python\n")

5.8 writelines() 误用

错误原因:使用 writelines() 时,没有添加换行符,导致内容不分行。

lines = ["Hello", "Python", "World"]
with open("example.txt", "w") as file:
    file.writelines(lines)  # 结果:HelloPythonWorld

解决方案:确保每个元素后面带上 \n

lines = ["Hello\n", "Python\n", "World\n"]
with open("example.txt", "w") as file:
    file.writelines(lines)

5.9 追加模式 ('a') 忘记换行

错误原因:追加内容时,没有换行,导致新内容直接接在原内容后面。

with open("example.txt", "a") as file:
    file.write("New Line")  # 可能和上一行连在一起

解决方案:确保写入时手动添加 \n

with open("example.txt", "a") as file:
    file.write("\nNew Line")

六、小结

  • 打开文件:使用 open("filename", "mode", encoding="..."),常见模式有 rwa

  • 读取内容read() 一次性读完全部,readline()/readlines()/循环可按行读,或分段读取大文件。

  • 写入内容:写文本用 w(覆盖)或 a(追加);记得手动加换行符 "\n"

  • 关闭文件:使用 with open(...) as f: 可以自动关闭,代码更简洁也更安全。

  • 注意编码:中文文件常使用 utf-8,若文件是其它编码,需要指定对应的 encoding

掌握这些基础操作,你就能读写各种文本文件,配合字符串处理、列表、字典等工具,让你在做数据处理、配置管理、日志记录时更加得心应手。

如果觉得这篇文章对你有帮助,欢迎点赞或分享给更多想学 Python 的朋友。继续加油,在文件操作的技能加持下,你能更轻松地处理日常项目中各种数据文件了!下次见~

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
在这里插入图片描述​​​​
在这里插入图片描述​​​​

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值