文件的高级应用
1. 可读、可写
r+:可读、可写
即可读又可写(尽量不要使用),r+ 是在后面追加
with open('test.py', 'r+', encoding='utf8') as fr: date = fr.read() fr.write('x = 10') print(date)
w+:可写、可读
清空文件的功能是w提供的,w+ 更不要使用
with open('test.py', 'w+', encoding='utf8') as fw: fw.write('x = 10') date = fw.read() print(date)
a+:可追加、可读
a有追加的功能,a的指针在末尾,a+的功能也没用
with open('test.py', 'a+', encoding='utf8') ad fa: fa.write('x = 10') date = fa.read() print(date)
2. 指针的应用
文件的内置方法有四种,只有read(n)涉及的是字符个数,seek()/tell()truncate()涉及的都是字节个数
seek()
seek()方法有两个参数,一个是offset,一个是whence。offset代表了文件指针的偏移量,单位是字节;whence代表了文件指针所在的位置,默认从文件头开始,0表示从头开始,1表示从当前位置开始,2表示从文件末开始
tell()
tell()方法是统计从文件开头到当前指针所在位置
read(n)
read(n)方法,读取文件内容,n表示了字符个数
truncate()
truncate()方法是截断文件,所以文件的打开方式必须是可写的,但不能用w或w+方法打开,这样会直接清空文件。truncate()不加参数,相当于清空文件。
文件修改的两种方式
首先文件没有修改的说法,只有覆盖的说法。
方式一
将硬盘存放的改文件内容全部加载到内存,在内存是可以修改的,修改完毕后,再由内存覆盖到硬盘
方式二
将硬盘存放的改文件的内容一行一行地读入内存,修改完毕后就写入新文件,最后用新文件覆盖原文件
总而言之,修改文件内容的思路是:以读的方式打开原文件,以写的方法打开一个新文件,把原文件的内容进行修改,然后写入新文件,之后利用os模块的方法,把原文件删除,重命名新文件为原文件名,以达到以假乱真的目的
import os
with open('原文件', 'r', encoding='utf8') as fr, \
open('新文件', 'w', encoding='utf8') as fw:
for i in fr:
i = i.replace('旧的内容', '新的内容')
fw.write(i)
os.remove('原文件') # 删除原文件
os.rename('新文件名', '原文件名') # 重命名新文件为原文件名
函数
函数就是具有某种功能的工具,函数能提高应用的模块性和代码的重复利用率,是为了让代码分块化。函数更多的是一种思想,而不是一种技术。
函数的定义
Python中定义函数要使用def关键字,一般格式如下
def 函数名(): # 定义阶段
'''函数注释写在这里''' # 函数相当于工具,那注释就相当于工具的说明书
<代码块>
函数在定义阶段不执行函数体的代码块,只检测是否有语法错误
函数的调用
函数的调用是为了使用函数的功能。
函数名(...)就可以调用函数了,调用函数后会执行函数体代码,直到碰到return或者执行完函数体内所有代码结束。
定义函数的三种形式
定义函数有三种形式,分别是空函数、无参函数、有参函数
空函数
当我们需要实现一个功能,但不知道如何用代码实现的时候,这个时候可以先写个空函数,然后先去实现其他的功能
def func(): pass
无参函数
在函数定义阶段,括号内没有参数,为无参函数;定义的时候无参,那么调用的时候也不需参数。
如果函数体代码逻辑不需要依赖外部传入的值,就必须得定义成无参函数。
def func(): print('Hello World') func() #Hello World
有参函数
在函数定义阶段,括号内有参数,称为有参函数;定义的时候有参,那么调用的时候就必须传入参数。
如果函数体代码逻辑需要依赖外部传入的值,就必须得定义成有参函数。
def add(x, y): '''求和''' res = x + y print(res) add(1, 2) #3
函数的参数
之前我们讲了参数,那么什么是参数,参数是函数体接受外部传值的一种媒介,其实参数就是一个变量名。
那么我们就来讲讲这个参数。
首先要讲的是参数,参数分为形参和实参。
1.1形参:在函数定义阶段,括号内定义的参数,称为形式参数,简称形参,本质就是变量名。
1.2实参:在函数调用阶段,括号内传入的参数,称为实际参数,简称实参,本质就是变量名。
然后要讲的就是位置参数了,位置参数分为位置形参和位置实参。
2.1位置形参:在函数定义阶段,按照从左到右的顺序依次定义的形参,叫位置形参。
2.2位置实参:在函数定义阶段,按照从左到右的顺序依次定义的实参,叫位置实参。
这个位置形参和位置实参,要从左到右一一对应的接受值和传值,不能多也不能少。
第三个要讲的就是默认形参了。
默认形参,在定义阶段,就已经被赋值了。
那么我们调用的时候可以不用传参,可以使用默认值,如果传参了那就使用传的值。
但是默认形参必须放在位置形参的后面。
最后一个要说的就是关键字实参了。
关键字实参:在调用函数的时候,按照形参名给具体的值,称为关键字实参。
关键字实参可以打破位置形参必须一一对应传值的规定,但是关键字实参必须放在位置实参的后面。
总结一下,我们在定义函数的时候,参数最好不要超过3个,一般时候用位置形参和位置实参,默认形参和关键字实参在需要用的时候使用。
函数的返回值
返回值:函数内部代码经过一些逻辑处理获得的结果。
当我们需要对函数的处理结果做进一步的处理的时候,就需要函数必须要有返回值了。
函数的返回值用return来返回。
return是函数结束的标志,当函数执行到return,函数就会终止。
return的返回值可以返回任意数据类型。
return的返回值没有个数限制,可以使用逗号隔开返回多个值,不加括号返回多个值时,默认用元组的形式返回,没有返回值,会返回None。