文件光标移动、数据修改和函数简介、语法结构

今日内容总结

一、文件内光标到的移动

二、文件的修改

三、函数简介

四、函数的语法结构

一、文件内光标的移动

1 、简介

haha.txt的内容为:锄禾日当午,上班好幸苦
with open(r'haha..txt','r',encoding='utf8')as f:
    print(f.read(3))  # 结果为 锄禾日
    # raed在文本模式下,括号内的数字表示的是读取指定的字符个数
  
with open(r'haha.txt','rb') as f:
    print(f.read(3).decode('utf8'))  # 结果为 锄
    # read在二进制模式下,括号内的数字表示的是读取指定的字节数
    # unicode所有的字符都是用2bytes来起步表示
    # utf8中文都是用3bytes来表示,英文用1bytes来表示

2 、控制光标的移动

haha.txt的内容为:锄禾日当午,上班好幸苦
with open(r'haha.txt','r',encoding='utf8')as f:
    print(f.read(1))  # 结果为锄
    f.seek(3,0)
    print(f.raed(1))  # 结果为禾
    print(f.tell())  # 结果为6
    # seek可以控制光标的移动,在文本模式下移动的单位也是字节数
    seek(offset,whence)  # 两个参数格式
    offset:用来控制移动的字节数
    whence:控制模式
    whence有三个数:
    '''
    seek中whence位如果没有填写值,默认是0       '''
       0 :就是让光标移动到文件开头处
        可以支持文本模式和二进制模式
        
       1 :就是让光标停留在当前的位置
        只支持二进制模式
        
       2 :就是让光标移动到文件末尾处
         只接受二进制模式
 """  line可以实时监测文件内是否有新增的内容并打印出来   """

二、文件的修改

冷知识:硬盘有两个形态
    占有态和自由态
    我们在删除数据时,就是将原来的位置标记为自由态,再下载时新的数据落到这个自由态上面就会直接覆盖
  ''' 文件数据在硬盘上是刻死的,不可能在中间增加新的内容,只能将老内容移除之后,再刻上新的内容'''  

1 、文件修改方法一

1、先将文件内容一次性读写到内存中
2、然后使用只写不读模式,进行修改
优点为:在文件修改过程中同一数据只有一份
缺点为:占内存
方法:
haha.txt:锄禾日当午,上班好幸苦
with open(r'haha.txt','r',encoding='utf8')as f:
    data = f.read
open(r'haha.txt','w',encoding='utf8')as f:
    f.write(data.replace('锄禾日当午','太阳当空照'))
    haha.txt内容为:太阳当空照,上班好幸苦

2 、文件修改方法二

1、用写的模式打开源文件
2、用写的模式打开一个临时文件,一行行读取源文件内容
3、修改完后写入临时文件
4、删除源文件,将临时文件重命名源文件名
优点:不会占太多内内存
缺点:在文件修改过程中同样一份数据存两遍
使用方法:
haha.txt:太阳当空照,上班好幸苦
import os
with open(r'haha.txt','r',encoding='utf8')as read_f,\
open(r'.haha.txt.swap','w'encoding='utf8')as f:
    for line in read_f:
        write_f.write(line.replace('太阳当空照','锄禾日当午')
os.remove('haha.txt') 
os.rename('.haha.txt.swap','haha.txt')
结果为 haha.txt:锄禾日当午,上班好幸苦

三、函数简介

# 函数其实就像是工具,提前定义好之后,就可以反复的使用
查看内部源码=ctrl+左键
l1 = [11, 22, 33, 44, 55, 66]
列表统计我们习惯使用len,还有for循环但for循环不是所有数据类型都可以使用
l1 = 'hello world'
print(len(l1))
def my_len():
    n = 0
    for i in l1:
        n += 1
    print('字符串中字符的个数',n)
    
##############——函数与循环的区别——##############    
   在不同的地方,反复执行相同的代码>>>:函数
   在相同的地方,反复执行相同的代码>>>:循环
    
 ##############################################  
def my_len():
    n = 0
    for i in l1:
        n += 1
    print('字符串中字符的个数',n)
    print(my_len())
    这几行代码和真正len的差距
      1、真正的len可以统计指定数据的元素个数,我们使用的len现在只有统计指定的数据
      2、真正的len执行后有结果,我们的len执行后结果是None
    

四、函数的语法结构

def + 函数名 +(参数):
    ''' 函数的注释 '''
    函数体代码
    return 返回值

1、def:定义函数的关键字
    
2、函数名:函数名类似于变量名,指函数体代码,命名与变量名一致

3、括号:定义函数的时候,函数名后面肯定要先写括号

4、参数:类似于使用函数的时候,给函数内部传递的数据,可以不写,也可以写好好几个

5、冒号:定义函数也需要有缩进的代码块

6、函数的注释:解释函数的主要功能、使用方法等说明性的文字

7、函数体代码:函数的核心功能

8、return:后面加的东西,执行函数完就会返回

"""   
 定义i函数需要使用def关键字
   定义函数的过程不会执行函数,自会检测它的语法
     例如:
     def index():
         whydeuge  定义的时候不会发生报错
     def index1():
         if  语法定义时语法错误就会发生报错
"""

这是len的函数结构

今日总结~

posted @ 2022-03-15 17:52  未月  阅读(102)  评论(0)    收藏  举报