Python文件操作与函数定义详解:编码、读写模式及修改策略

叶初
叶初
发布时间:2026-10-13 | 6人浏览过
原创

本文详解Python文件操作核心知识,涵盖ASCII、GBK到UTF-8的字符编码演变及Python2与Python3的差异。深入解析r、w、a及t、b模式的组合用法,介绍with语句的文件上下文管理。重点对比全量加载与逐行处理两种文件修改方式,并系统讲解无参、有参及空函数的定义规范与应用场景。

Python文件操作概述

本文通过具体实例深入解析Python文件操作函数的使用方法,内容详实,对读者的学习或实际工作具有显著的参考价值,建议相关读者仔细阅读并参考。

字符编码机制

字符编码基础

理解二进制数据与人类可读字符之间的转换机制,即字符编码的核心原理。

不同国家制定了各自的编码标准,例如ASCII、GBK等,用于表示文本信息。

美国计算机内存中通常采用ASCII编码存储数据,而中国计算机内存中则采用GBK编码。这导致美国编写的程序在中国电脑上无法正确识别,反之亦然,造成跨平台兼容性问题。

硬盘中已存在的文件采用ASCII、GBK等特定编码格式,这些格式一旦确定便无法更改。为了解决兼容性问题,内存中引入了Unicode编码,它能够识别并处理ASCII、GBK等多种编码格式的文件。

当使用Unicode编码运行ASCII或GBK文件后,若要将结果保存回硬盘,早期做法是直接存储Unicode。然而,由于Unicode将8位字符扩展为16位存储,导致空间浪费。为此,出现了UTF-8编码,它作为Unicode的压缩版本,在保持兼容性的同时节省了存储空间。

UTF-8能够识别其他国家的编码标准,但仅直接处理Unicode数据。尽管目前代码多采用UTF-8格式,但内存中尚未完全普及UTF-8。随着历史遗留的ASCII或GBK文件逐渐被淘汰或转换为UTF-8格式,未来内存中也将全面采用UTF-8编码。

Python2与Python3在字符编码处理机制上存在显著区别。

  • 启动Python解释器是进行代码执行的第一步。
  • Python解释器类似于文本编辑器,负责将读取到的二进制数据转换为普通字符,例如执行赋值语句 a = 1。
  • 转换后的普通字符被解释执行,定义变量时会开辟新的内存空间来存放该变量。

Python版本编码差异

在Python2环境中:

变量以文件指定的编码方式存储到内存中。

在Python3环境中:

变量统一使用Unicode编码方式存储。

文件以何种格式存储,就应当以相同的格式进行读取,以确保数据一致性。

文件打开模式详解

文件主要有三种打开方式,分别对应不同的操作需求。

  • r:只读模式(read),仅允许读取文件内容。
  • w:只写模式(write),写入前会清空文件内容;若文件不存在,则自动创建新文件。
  • a:追加模式,在文件末尾添加内容;若文件不存在,则自动创建新文件。

文本模式(t):用于处理文本数据,默认编码方式取决于系统或指定参数。

二进制模式(b):用于处理图片、音频等非文本数据,不进行编码转换。

t或b模式不能单独使用,必须与r、w、a模式结合使用,例如rb、wb、ab等。

文件上下文管理

使用with语句管理文件上下文,可以自动处理文件的关闭操作,避免资源泄露。

语法示例:with open() as f:,该结构会在代码块执行完毕后自动关闭文件。

文件修改策略

一、文件修改的两种实现方式

文件数据存储在硬盘上,因此严格来说只存在覆盖操作,不存在直接修改。平时看到的文件修改实际上是模拟效果,主要通过以下两种方式实现。

1.1 方式一:全量加载修改

将硬盘上的文件内容全部加载到内存中,在内存中进行修改。修改完成后,再将内存中的数据覆盖写回硬盘(Word、vim、Notepad++等编辑器通常采用此方式)。


import os

with open('37r.txt') as fr, \
    open('37r_swap.txt', 'w') as fw:
  data = fr.read() # 全部读入内存,如果文件很大,会很卡
  data = data.replace('tank', 'tankSB') # 在内存中完成修改

  fw.write(data) # 新文件一次性写入原文件内容

# 删除原文件
os.remove('37r.txt')
# 重命名新文件名为原文件名
os.rename('37r_swap.txt', '37r.txt')
print('done...')

1.2 方式二:逐行处理修改

将硬盘文件内容逐行读入内存,每读取一行就进行修改,并将修改后的内容写入新文件。处理完毕后,用新文件覆盖源文件。


import os
with open('37r.txt') as fr,\
    open('37r_swap.txt', 'w') as fw:
  # 循环读取文件内容,逐行修改
  for line in fr:
    line = line.replace('jason', 'jasonSB')
    # 新文件写入原文件修改后内容
    fw.write(line)
os.remove('37r.txt')
os.rename('37r_swap.txt', '37r.txt')
print('done...')

总结而言,修改文件内容的通用思路是:以读模式打开原文件,以写模式打开一个新文件,将原文件内容修改后写入新文件,最后利用os模块删除原文件并将新文件重命名为原文件名,从而实现看似原地修改的效果。

函数定义类型

二、定义函数的三种基本方式

2.1 无参函数

函数参数是函数体接收外部传值的媒介,本质上是一个变量名。

在函数定义阶段括号内没有参数,称为无参函数。需注意:定义时无参,调用时也不需传入参数。

如果函数体代码逻辑不依赖外部传入的值,必须定义为无参函数。


def func():
  print('hello nick')
func() # hello nick

2.2 有参函数

在函数定义阶段括号内包含参数,称为有参函数。需注意:定义时有参,调用时必须传入相应参数。

如果函数体代码逻辑依赖外部传入的值,必须定义为有参函数。


def sum_self(x, y):
  """求和"""
  res = x+y
  print(res)
sum_self(1,2) # 3

2.3 空函数

当已知需要实现某个功能但暂不知如何用代码实现时,可先编写一个空函数,以便先实现其他功能。


def func():
  pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表