=============================================文件处理补充============================================
一、文件内指针的移动
大前提:文件内指针的移动是Bytes为单位的,唯独t模式下的read读取内容个数是以字符为单位
f.read(3) read的t模式下是以字符为单位进行读取的,这里3表示只读取3个字符
比如输出为:你a我
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read(3)
print(data)
with open('a.txt',mode='rb') as f: rb模式下read里边的数字表示读取三个字节,在这里即读
取'你'所占的三个字节,读取出来之后为二进制,使用decode
解码之后,输出为:你
data=f.read(3)
print(data.decode('utf-8'))
f.seek(指针移动的字节数,模式控制): (seek里边的两个参数)控制文件指针的移动
模式控制:
0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
f.tell()查看文件指针当前距离文件开头的位置,输出时会给一个数字返回值,表示当前指针距离文件开头的字节数
0模式详解
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(4,0)
print(f.tell()) 比如这里会给一个返回值4 表示指针距离文件开头为4个字节的距离
print(f.read())
with open('a.txt',mode='rb') as f:
# f.seek(4,0)
f.seek(2,0) 在UTF-8编码模式下,改行操作会进行报错,因为在utf-8模式下,汉子是以3个字节为单位的,在这里 输入两个字节不能完成读取一个汉字占用的字节.使用b模式打开某个文件时,如果输出结果会进行报错
print(f.tell())
print(f.read().decode('utf-8'))
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(5,0)
print(f.read())
1模式详解
with open('a.txt',mode='rb') as f:
f.seek(3,1)
print(f.tell())
f.seek(4,1)
print(f.tell())
print(f.read().decode('utf-8'))2模式详解
须知一:
硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容
内存控制可以修改
with open('a.txt','r+t',encoding='utf-8') as f:
f.seek(4,0)
print(f.tell())
f.write('我擦嘞')
须知二:
文件对应的是硬盘空间,硬盘不能修改应为文件本质也不能修改,
我们看到文件的内容可以修改,是如何实现的呢?
大致的思路:将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘
具体的实现方式分为两种:
1. 将文件内容一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
优点: 在文件修改过程中同一份数据只有一份
缺点: 会过多地占用内存
with open('db.txt',mode='rt',encoding='utf-8') as f:
data=f.read() 打开文件并将文件内容读取到内存
with open('db.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('kevin','SB')) 打开文件(这时在使用w命令写入文件虽然会清空原来的文件
但是上一步已经把所有文件内容全部读取出来了,所以除了要修改
的部分其他部分不会发生变化)并使用replace指令修改指定的内容
2. 以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
优点: 不会占用过多的内存
缺点: 在文件修改过程中同一份数据存了两份
import os import:调用或者是使用别人封装好的功能接口
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\ (打开原文件)
open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f: (打开临时文件)
for line in read_f:
wrife_f.write(line.replace('SB','kevin')) 从原文件中取内容并写入临时文件
os.remove('db.txt') 将原文件删除
os.rename('.db.txt.swap','db.txt') 将临时文件重命名
===========================================函数的基本使用===============================================
1. 什么是函数
具备某一功能的工具->函数
事先准备工具的过程--->函数的定义
遇到应用场景,拿来就用---->函数的调用
函数分类两大类:
1. 内置函数
2. 自定义函数
2. 为何要用函数
1. 代码冗余
2. 可读性差
3. 可扩展性差
3. 如何用函数
原则:必须先定义,再调用
定义函数的语法:
def(definition) 函数名(参数1,参数2,...): 自定义函数时,函数名后边的参数可设置可不设置,根据函数的具体功能,如果需要外 界给定值的话,就需要设定参数了
"""文档注释""" 文档注释需要对自定义的函数进行描述,包括函数的功能,函数参数代表的意义等等
code1
code2
code3
....
return 返回值 函数的返回值表示函数运行的结果,如果需要这个结果来做进一步的使用,就需要设 置返回值,如果不需要这个结果来做进一步的使用,就不需要设置返回值
返回值的使用:直接将函数当做一个判断条件或者一个值定义给变量使用,比如下面的用户登录程序,登陆成功可以返回一个True,失败返回一个False,需要用来做进一步的判断的时候(l=login()),直接使用if l : 就可以进行判断;再比如下边的比较大小的函数,在函数代码执行比较之后会得出一个值,需要再调用的时候,直接输入函数名,如:res=def max2(x,y),res*=12
调用函数的语法:
函数名(值1,值2,...)
def login():
uname=input('请输入用户名>>: ').strip()
pwd=input('password>>: ').strip()
if uname == 'egon' and pwd == '123':
print('login successfull')
return True
else:
print('user or password error')
return False
# print(login)
login()
login()
def max2(x,y):
# x=10
# y=20
if x > y:
return x
else:
return y
res=max2(3.1,2.3)
print(res*12)