当前位置: 首页 > news >正文

【Python语言基础】23、文件处理

文章目录

    • 1. 文件处理
      • 1.1 基本步骤
      • 1.2 打开文件
      • 1.3 读取文件
      • 1.4 写入文件
      • 1.5 使用with语句
    • 2. 二进制文件操作
    • 3. 文件指针操作
    • 4.读取大文件
      • 4.1 逐行读取
      • 4.2 按固定字节数读取
      • 4.3 使用生成器函数
    • 5. 异常处理

在 Python 里,文件操作是一项极为常用的功能,借助它能够对文件进行读取、写入、修改等操作

1. 文件处理

1.1 基本步骤

通常,文件操作包含以下几个基本步骤:

  1. 打开文件:使用 open() 函数打开指定的文件,获取文件对象。
  2. 操作文件:对文件对象进行读取、写入等操作。
  3. 关闭文件:使用 close() 方法关闭文件,释放系统资源

1.2 打开文件

在 Python 中,使用 open() 函数来打开文件,其基本语法如下:

file = open(file_path, mode)
  • file_path:文件的路径,可以是相对路径或绝对路径。

  • mode:文件的打开模式,常见的模式有:

    • ‘r’:只读模式,默认值。用于读取文件内容,如果文件不存在会抛出 FileNotFoundError 异常。
    • ‘w’:写入模式,用于创建新文件或覆盖原有文件内容。如果文件不存在,会创建新文件;如果文件已存在,会清空原有内容。
    • ‘a’:追加模式,用于在文件末尾追加内容。如果文件不存在,会创建新文件。
    • ‘b’:二进制模式,可与其他模式结合使用,如 ‘rb’ 表示以二进制只读模式打开文件。
    • ‘+’:读写模式,可与其他模式结合使用,如 ‘r+’ 表示以读写模式打开文件。

1.3 读取文件

打开文件后,可以使用以下方法读取文件内容:

  • read() 方法
    读取整个文件内容,返回一个字符串
# 以只读模式打开文件
file = open('example.txt', 'r')
# 读取整个文件内容
content = file.read()
print(content)
# 关闭文件
file.close()
  • readlines() 方法
    读取文件中的所有行,返回一个包含每行内容的列表
file = open('example.txt', 'r')
lines = file.readlines()
for line in lines:print(line)
file.close()

1.4 写入文件

使用 write() 方法可以向文件中写入内容:

# 以写入模式打开文件
file = open('example.txt', 'w')
# 写入内容
file.write('Hello, World!\n')
file.write('This is a test file.\n')
# 关闭文件
file.close()

在写入模式下,如果文件已存在,原有内容会被覆盖。如果需要追加内容,可以使用追加模式 ‘a’:

# 以追加模式打开文件
file = open('example.txt', 'a')
# 追加内容
file.write('This is additional content.\n')
# 关闭文件
file.close()

1.5 使用with语句

为了避免忘记关闭文件,可以使用 with 语句,它会在代码块执行完毕后自动关闭文件:

# 使用 with 语句打开文件
with open('example.txt', 'r') as file:content = file.read()print(content)
# 文件会自动关闭

2. 二进制文件操作

对于二进制文件,如图片、视频等,需要使用二进制模式进行操作。例如,复制一张图片:

# 以二进制只读模式打开源文件
with open('source.jpg', 'rb') as source_file:# 以二进制写入模式打开目标文件with open('destination.jpg', 'wb') as destination_file:# 读取源文件内容content = source_file.read()# 写入目标文件destination_file.write(content)

3. 文件指针操作

在文件操作过程中,文件指针会记录当前的读写位置。可以使用以下方法操作文件指针:

  • seek(offset, whence) 方法:移动文件指针的位置。
    • offset:偏移量,正数表示向后移动,负数表示向前移动。
    • whence:参考位置,可选值为:
      • 0:从文件开头开始计算偏移量,默认值。
      • 1:从当前位置开始计算偏移量。
      • 2:从文件末尾开始计算偏移量。
with open('example.txt', 'r') as file:# 读取前 5 个字符first_five = file.read(5)print(first_five)# 将文件指针移动到文件开头file.seek(0)# 再次读取前 5 个字符first_five_again = file.read(5)print(first_five_again)
  • tell() : 返回文件对象当前的文件指针位置,单位是字节。文件指针就像是你看书时书签所在的位置,它标记着你当前读到了哪里。
# 以只读模式打开文件
file = open('test.txt', 'r')
# 读取前 5 个字符
file.read(5)
# 获取当前文件指针的位置
position = file.tell()
print(f"当前文件指针位置是: {position} 字节")
# 关闭文件
file.close()

4.读取大文件

当使用 Python 读取大文件时,由于文件过大,一次性将整个文件内容加载到内存中会导致内存占用过高,甚至引发内存溢出错误。因此,需要采用一些特殊的策略来处理大文件。

以下是几种常见的方法:

4.1 逐行读取

逐行读取是最常用的方法,它每次只读取文件的一行内容,处理完一行后再读取下一行,这样可以显著减少内存的使用。

# 打开大文件,使用 'r' 模式表示以只读文本模式打开
with open('large_file.txt', 'r', encoding='utf-8') as file:# 遍历文件的每一行for line in file:# 对每一行进行处理,这里只是简单打印,你可以根据需求修改print(line.strip())

说明:

  • with open(‘large_file.txt’, ‘r’, encoding=‘utf-8’) as file:使用 with 语句打开文件,这样可以确保文件在使用完后自动关闭。‘r’ 表示只读模式,encoding=‘utf-8’ 用于指定文件的编码格式。
  • for line in file:这是一个迭代器,会逐行读取文件内容。
  • print(line.strip()):对读取的每一行进行处理,这里使用 strip() 方法去除行首尾的空白字符并打印,你可以根据实际需求对每一行进行其他操作。

4.2 按固定字节数读取

如果逐行读取不满足需求,也可以按固定的字节数读取文件内容。

# 以二进制只读模式打开文件
with open('large_file.txt', 'rb') as file:# 每次读取 1024 字节(即 1KB)的数据while True:chunk = file.read(1024)if not chunk:# 如果读取到文件末尾(读取内容为空),则退出循环break# 对读取的字节块进行处理,这里只是简单打印,你可以根据需求修改print(chunk.decode('utf-8').strip())

说明:

  • with open(‘large_file.txt’, ‘rb’) as file:以二进制只读模式(‘rb’)打开文件。
  • while True:使用无限循环不断读取文件内容。
  • chunk = file.read(1024):每次读取 1024 字节的数据。
  • if not chunk: break:如果读取到的内容为空,说明已经到达文件末尾,退出循环。
  • print(chunk.decode(‘utf-8’).strip()):将读取的字节数据解码为字符串(假设文件编码为 UTF-8),去除首尾空白字符并打印,你可以根据实际需求对数据进行其他操作。

4.3 使用生成器函数

可以定义一个生成器函数来读取文件,这样可以将读取和处理逻辑分离,使代码更具模块化。

def read_large_file(file_path, chunk_size=1024):# 以二进制只读模式打开文件with open(file_path, 'rb') as file:while True:# 每次读取指定字节数的数据chunk = file.read(chunk_size)if not chunk:# 如果读取到文件末尾,则退出循环break# 使用 yield 关键字将读取的字节块作为生成器的一个元素返回yield chunk# 调用生成器函数并处理文件内容
for chunk in read_large_file('large_file.txt'):print(chunk.decode('utf-8').strip())

说明:

  • def read_large_file(file_path, chunk_size=1024):定义一个生成器函数,接收文件路径和每次读取的字节数作为参数。
  • yield chunk:使用 yield 关键字将读取的字节块作为生成器的一个元素返回,这样可以实现按需读取。
  • for chunk in read_large_file(‘large_file.txt’):调用生成器函数并遍历生成器,对每个字节块进行处理。

通过以上方法,可以在 Python 中高效地读取大文件,避免内存问题。选择哪种方法取决于文件的特点和具体的处理需求。

5. 异常处理

在进行文件操作时,可能会出现各种异常,如文件不存在、权限不足等。

可以使用 try-except 语句进行异常处理:

try:with open('nonexistent_file.txt', 'r') as file:content = file.read()print(content)
except FileNotFoundError:print('文件未找到!')
except PermissionError:print('没有权限访问该文件!')

相关文章:

  • 基于Springboot的网上拍卖系统
  • iwebsec靶场 文件包含关卡通关笔记11-ssh日志文件包含
  • Mysql相关知识2:Mysql隔离级别、MVCC、锁
  • 大数定理(LLN)习题集 · 题目篇
  • 深入了解802.11b:无线局域网的重要里程碑
  • QML 状态系统
  • Pycharm 如何删除某个 Python Interpreter
  • Arduino示例代码讲解:Project 07 - Keyboard 键盘
  • FastAPI-MCP
  • C++运算符重载详解
  • Vue3 + TypeScript,使用祖先传后代模式重构父传子模式
  • 【滑动窗口】串联所有单词的⼦串(hard)
  • 多态的主要好处与不足
  • 10.QT-显示类控件|LCD Number|ProgressBar|Calendar Widget(C++)
  • [论文阅读]Making Retrieval-Augmented Language Models Robust to Irrelevant Context
  • 论文阅读:2024 arxiv DeepInception: Hypnotize Large Language Model to Be Jailbreaker
  • Pandas高级功能
  • C++入门篇(下)
  • 【支付】支付宝支付
  • go+mysql+cocos实现游戏搭建
  • 广西出现今年首场超警洪水
  • 云南省交通发展投资有限责任公司原党委书记、董事长陈以东接受审查调查
  • 黄山旅游:去年黄山景区累计接待进山游客492.24万人,同比增长7.6%
  • A股午后回暖三大股指涨跌互现:地产银行联袂上攻,两市成交9146亿元
  • 美国佛罗里达州立大学枪击事件已致2人死亡
  • 习近平同柬埔寨首相洪玛奈举行会谈