Python文件操作与函数定义详解:编码、读写模式及修改策略
本文详解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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









