文件操作和函数简介

文件操作和函数简介

文件内光标的移动

#大前提:文件内指针的移动是Bytes为单位的,唯独t模式下的read读取内容个数是以字符为单位
 f.read(3)
 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:
     data=f.read(3)
     print(data.decode('utf-8'))
    
    
f.seek(指针移动的字节数,模式控制): 控制文件指针的移动
模式控制:
0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
1: 该模式代表指针移动的字节数是以当前所在的位置为参照的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())
     print(f.read())

 with open('a.txt',mode='rb') as f:
     # f.seek(4,0)
     f.seek(2,0)
     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',mode='rb') as f:
     f.seek(-9,2)
     data=f.read()
     print(data.decode('utf-8'))

# tail -f access.log  实时检测文件内是否有新增内容并打印出来

with open('access.log',mode='rb') as f:
    f.seek(0,2)
    while True:
        line=f.readline()
        if len(line) == 0:
            # 没有内容
            continue
        else:
            print(line.decode('utf-8'),end='')

文件的修改

#方式一:
硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容
内存控制可以修改

#代码示例:
with open('a.txt','r+t',encoding='utf-8') as f:
    f.seek(4,0)
    print(f.tell())
    f.write('我擦嘞')
    
'''    硬盘上的数据有两个状态
		占有态与自由态
			我们删除数据其实就是将数据原来的位置标记成自由态
			之后如果有新的数据进来了并且落到了自由态位置那么直接覆盖
ps:自己不用的手机和电脑 不要轻易的卖掉
	先删除所有的数据 然后找一些无关紧要的数据存储一遍(比如500G的葫芦娃)
	之后再删除一次 '''


#方式二:
文件对应的是硬盘空间,硬盘不能修改应为文件本质也不能修改,
将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘

# 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'))



# 2. 以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os

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') #重命名文件


函数的简介:

#函数是python为了代码最大程度地重用和最小代码冗余而提供的基本数据结构。 函数是一种设计工具,可能将复杂的程序,分解成可以管理的块。

在python中可以创建四种函数:

1.全局函数:定义在模块中
2.局部函数:嵌套在其他函数中
3.lambda函数:表达式
4.方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用。
 
''' 我们需要在不同的地方 反复执行相同的代码>>>:函数
 我们需要在相同的地方 反复执行相同的代码>>>:循环'''

#代码示例:
def my_len():
    n = 0
    for i in s:
        n += 1
    print('字符串中字符的个数', n)
# print(my_len())
"""
上述代码与真正的len差距
    1.真正的len可以统计指定数据的元素个数
        而我们的len目前只能统计指定的数据
    2.真正的len执行完成后有结果
        而我们的len执行完成后结果是None
"""

函数的语法结构

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

1.def	
	是定义函数的关键字
2.函数名
	函数名类似于是变量名 指代函数体代码 命名与变量名一致
3.括号
	定义函数的时候 函数名后面肯定要先写括号
4.参数
	类似于使用函数的时候 给函数内部传递的数据 可以不写 或者单个、多个
5.冒号
	定义函数也需要有缩进的代码块
6.函数的注释
	用于解释函数的主要功能、使用方法等说明性文字
7.函数体代码
	函数的核心功能 也是我们将来编写的核心
8.return
	后面跟什么 那么执行完函数之后就会返回什么

函数的调用形式

#函数的调用形式:

语句形式:

func()

#表达式形式:

res = func2(10)

#函数当另一个函数的参数传入一个函数调用:

res = func3(func2(10))

函数的作用域

python创建、改变或者查找变量名都是在名称空间进行

在代码中变量名被赋值的位置决定了其能被访问到的范围

函数定义了本地作用域,而模块定义了全局作用域

每个模块都是一个全局作用域,因此全局作用域仅限单个程序文件。

每次对函数的调用都会创建一个新的本地作用域,赋值的变量除非声明为全局变量,否则均为本地变量。

所有的变量名都可以归纳为本地、全局或者内置的变量。

#内置名称空间:python解释器自带的名字,python解释器启动就会生成。

#全局名称空间:文件和模块级别定义的名字都会。

#局部名称空间:定义在函数内部的名字。局部名称空间只有在函数调用时才会生效,调用结束失效。

#变量名解析:LEGB原则,作用域越小优先级越高,某个变量,现在本地函数找,找不到去上一层函数找,再找不到就去模块全局变量找,再找不到就去系统内置的变量找,最后还是内找不到,抛出异常。

LEGB原则:

备注:

global定义全局变量,可以在函数内部改变函数外面定义的全局变量的赋值

locals局部作用域,可以改变函数内变量赋值,无论函数内套多少层函数。


posted @ 2022-03-15 18:02  洛阳城门听风雨  阅读(48)  评论(0)    收藏  举报