我的Python成长之路---Day9-文件处理的补充和Python中的函数基础使用

版权声明:此博客实属作者原创,转载请注明出处! https://blog.csdn.net/Onion_cy/article/details/82801386

=============================================文件处理补充============================================

一、文件内指针的移动

大前提:文件内指针的移动是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)

猜你喜欢

转载自blog.csdn.net/Onion_cy/article/details/82801386
今日推荐