zoukankan      html  css  js  c++  java
  • 7 文件操作

    一 打开文件的方式

    1  f = open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8')

    f.flush()

    f.close()

    2 with open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8') as f,

      open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8')  打开多个文件方式

    二 文件常用的操作方法

    • r  读取文件
    open表示打开一个文件
    f 变量, 操控胡辣汤.txt文件的句柄
    
    f = open("胡辣汤", mode="r", encoding="utf-8")
    读取文件中的内容
    read(n) 读取n个字符
    content = f.read(3)
    content = f.read() # 一次性全都读取出来,占内存
    
    line = f.readline() # 读取一行数据
    print(line.strip()) # strip()去掉空白。空格, 	 
    
    line = f.readline() # 读取一行数据
    print(line.strip())
    
    lst = f.readlines() # 一次性全都读取出来, 返回的是列表包括换行符
    print(lst)
    R
    • w 写入文件

      特点: 先清空文件里面的内容再写入

    W
    f = open("黑猫记者", mode="w", encoding="utf-8") # w可以帮我们创建文件
    # f.write("
    ")
    f.write("太黑
    ")
    f.write("很黑
    ")
    f.write("特别黑
    ")
    f.close()

    • a 追加模式

      特点:只能在文本末尾添加

    • b 模式

      特点:一般使用在图片,视频等非文字文件的操作

    b - bytes 读取和写入的是字节 , 用来操作非文本文件(图片, 音频, 视频)
    rb, wb, ab
    
    # 把刘亦菲从d盘复制到g盘, 单纯的从bytes角度来复制的。 适用于所有文件
    f1 = open(r"d:刘亦菲.jpeg", mode="rb")
    f2 = open(r"g:刘亦菲.jpeg", mode="wb")
    
    for line in f1: # 分批量的读取内容
        f2.write(line) # open()出来的结果可以使用read或者write. 根据mode来看
    
    f1.close()
    f2.close()
    b
    • r+  读写, w+  写读, a+ 追加写读, r+b, w+b, a+b

      特点:一般

    正常的
    f = open("唐诗", mode="r+", encoding="utf-8")
    content = f.read()
    f.write("黄蓉")
    print(content)
    
    # 错误的示范
    f = open("person", mode="r+", encoding="utf-8")
    f.write("杨千桦") # 默认如果直接写入的话。 在开头写入。 覆盖开头的内容
    content = f.read()
    print(content)
    
    # r+
    # 坑: 不论你读取多少内容。再次写入的时候都是在末尾
    f = open("唐诗", mode="r+", encoding="utf-8")
    info = f.read(3)
    f.write("胡辣汤")
    print(info)
    r+常见操作及坑
    • w+ 写读(不常用)
    # w+
    f = open("唐诗", mode="w+", encoding="utf-8") # 先清空。 然后再操作
    f.write("你好。 我叫肿瘤君")#清空文件写入
    f.seek(0)#移动光标可以读取
    content = f.read() # 写入东西之后。 光标在末尾。 读取不到内容的
    print(content)
    f.close()
    w+注意事项
    • a+ 追加写读
    # a+, 不论光标在何处 写入的时候都是在末尾
    f = open("唐诗", mode="a+", encoding="utf-8")
    f.write("我叫李嘉诚") # 默认写在末尾
    f.seek(0)#移动光标可以读取
    content = f.read()#写入之后光标在最后不可读
    print(content)
    f.close()
    View Code

    三 文件中几个操作方法

    1. seek(参数1,参数2)移动光标
        参数1 表示的是偏移量,移动多少个单位
        参数2 表示从什么位置进行偏移
          0: 光标移动到开头
          1: 当前位置
          2: 光标移动到末尾
        f.seek(3) # 以字节为单位
        info = f.read(3) # 读取三个字符

      2
    tell() 程序返回当前光标的位置
       3  truncate() 截断文件. 慎用按字节截取

      四 文件的修改

    import os # 导入os模块
    
    import time # 时间模块
    
    # 优点:不用关闭句柄, 自动关闭连接
    with open("唐诗", mode="r", encoding="utf-8") as f1,
        open("唐诗_副本", mode="w", encoding="utf-8") as f2:
        for line in f1:
            line = line.replace("善良", "sb")
            f2.write(line)
    
    time.sleep(5)
    os.remove("唐诗") # 删除源文件
    time.sleep(5)
    os.rename("唐诗_副本", "唐诗") # 把副本改名成源文件
    View Code
    • 文件修改的一道练习
    6,文件a1.txt内容

    序号 部门 人数 平均年龄 备注
    1 python 30 26 单身狗
    2 Linux 26 30 没对象
    3 运营部 20 24 女生多
    通过代码,将其构建成这种数据类型:
    [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
    with open('ax', mode='r', encoding='utf8') as f:
        lis1=[]
        lis2=[]
        line1=f.readline()
        line1=line1.strip().split(' ')
        for i in line1:
            if i is not '':
                lis2.append(i)
        # print(lis2)
        for line in f:
            lis3 = []
            dic = dict()
            line=line.strip().split(' ')
            print(line)
            for m in line:
                if m is not '':
                    lis3.append(m)
            # print(lis3)
            for i in range(len(lis2)):
                dic[lis2[i]] = lis3[i]
            lis1.append(dic)
    print(lis1)
    View Code

     7 用户注册登陆

    # 12,写一个函数完成三次登陆功能,再写一个函数完成注册功能(升级题)
    
    def register():
            while 1:
                with open('账号密码', 'r+', encoding='utf8') as f:
                    name = input('用户名:')#打开文件注意一般在循环里面
                    password = input('密码:')#因为光标会随着for循环移动
                    for line in f:                    #导致光标前面的内容无法检测
                        # print(line.strip())      #可以用seek函数移动光标
                        # line = line.strip().split(':')
                        # if line[0] == name:
                        if line.strip().split(':')[0] == name:
                            print('该用户已经注册,请重新注册')
                            break
                    else:
                        # f.seek(0,2)
                        f.write(name+':'+password+'
    ')
                        print('完成注册')
                        break
    register()
    
    def land():
        m = 3
        # with open('账号密码',encoding='utf8') as f:
        while m > 0:
            with open('账号密码', encoding='utf8') as f:
                name = input('输入用户名:').strip()
                passwrd = input('输入密码:').strip()
                for line in f:
                    line = line.strip().split(':')
                    if line[0] == name and line[1] == passwrd:
                        print('登陆成功')
                        m = 0
                        break
                else:
                    m -= 1
                    print('用户名或者密码错误还有%s次机会'% m)
    land()                                                
    函数
  • 相关阅读:
    04 SecurityContextHolder与SecurityContext说明
    03 spring security执行流程分析
    02 spring security 自定义用户认证流程
    01 spring security入门篇
    第三周进度
    第二周进度
    一维整数组所有子数组和的最大值
    初入园子,自我介绍
    密码登录源码(jsp+java+数据库)
    第一周总结
  • 原文地址:https://www.cnblogs.com/-0121/p/9858507.html
Copyright © 2011-2022 走看看