zoukankan      html  css  js  c++  java
  • 学习python课程第九天

    一.文件内的指针移动

    大前提:文件内指针的移动是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: 该模式代表指针移动的字节数是以当前所在的位置为参照的
    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'))


    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('我擦嘞')


    须知二:
    文件对应的是硬盘空间,硬盘不能修改应为文件本质也不能修改,
    我们看到文件的内容可以修改,是如何实现的呢?
    大的的思路:将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘
    具体的实现方式分为两种:
    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')


    三.函数的简析:

    1. 什么是函数
    具备某一功能的工具->函数
    事先准备工具的过程--->函数的定义
    遇到应用场景,拿来就用---->函数的调用

    函数分类两大类:
    1. 内置函数
    2. 自定义函数

    2. 为何要用函数
    1. 代码冗余
    2. 可读性差
    3. 可扩展性差

    3. 如何用函数
    原则:必须先定义,再调用

    定义函数的语法:
    def 函数名(参数1,参数2,...):
    """文档注释"""
    code1
    code2
    code3
    ....
    return 返回值
    调用函数的语法:
    函数名(值1,值2,...)

    1.不用参数的函数:

    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()

    2.加入参数的函数:

    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)


  • 相关阅读:
    vue Tab切换
    Vue+WebSocket 心跳机制 保持连接
    查询字符串是否包含某个字符
    vue+element 增删改查
    vue+DataV大屏数据展示
    向远程服务器发送并接受文件
    asp.net WebApi自定义权限验证消息返回
    jCryptoJS 、C#互通加密(MD5版)
    CryptoJS 、C#互通加解密(AES版)
    Dev 报表——MVC 中使用(版本号:15.2 )
  • 原文地址:https://www.cnblogs.com/lvyipin1/p/9687340.html
Copyright © 2011-2022 走看看