zoukankan      html  css  js  c++  java
  • day11-初始文件操作之open

    day10的回顾总结:

    1、集合内元素的三个特征
    必须为不可变类型
    无序
    不重复
    2、集合的用途是什么?
    关系运算
    去重
    3、举例说明关系运算
    交集
    s1 & s2
    并集
    s1 | s2
    差集
    s1 - s2
    s2 - s1
    对称差集
    s1 ^ s2
    父子集
    父集:
    s1 >= s2 成立,即s1包含s2,s1是s2的父集
    子集
    s1 <= s2 成立,即s1被s2包含,s1是s2的子集

    4、基于集合对列表去重l=[1,1,1,1,2,3,'a']
    简述集合去重的局限性
    1、无法保证被去重对象的顺序
    l=list(set(l))
    2、从被去重对象中取出的元素必须都为不可变类型
    set(l)


    5、如何解决python2乱码问题
    # coding:与文件存的编码格式一致
    x=u"上"

    6、如何解决python3乱码问题
    # coding:与文件存的编码格式一致

    7、编码encode、解码decode
    x="上" # str类型=》被存成unicode
    print(x)
    x.encode('gbk')


    8、补充(了解)
    文件头(只需针对主文件加文件头即可)
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-


    open()功能的使用
    1、模式介绍
    控制文件读写内容的模式
    t文本
    b二进制/bytes

    控制文件读写操作的模式
    r只读模式
    w只写模式
    a只追加写模式
    +:r+、w+、a+

    1、什么是文件
    文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口

    用户/应用程序(open())
    操作系统(文件)
    计算机硬件(硬盘)

    2、为何要用文件
    用户/应用程序可以通过文件将数据永久保存的硬盘中
    即操作文件就是操作硬盘

    用户/应用程序直接操作的是文件,对文件进行的所有的操作,都是
    在向操作系统发送系统调用,然后再由操作将其转换成具体的硬盘操作

    3、如何用文件:open()
    控制文件读写内容的模式:t和b
    强调:t和b不能单独使用,必须跟r/w/a连用

    t文本(默认的模式)
    1、读写都以str(unicode)为单位的
    2、文本文件
    3、必须指定encoding='utf-8'

    b二进制/bytes

    控制文件读写操作的模式
    r只读模式
    w只写模式
    a只追加写模式
    +:r+、w+、a+


    1、打开文件
    # windows路径分隔符问题
    open('C:a.txt bcd.txt')
    # 解决方案一:推荐
    open(r'C:a.txt bcd.txt')
    # 解决方案二:
    open('C:/a.txt/nb/c/d.txt')


    f=open(r'aaa/a.txt',mode='rt') # f的值是一种变量,占用的是应用程序的内存空间
    print(f)
    x=int(10)

    # 2、操作文件:读/写文件,应用程序对文件的读写请求都是在向操作系统发送
    系统调用,然后由操作系统控制硬盘把输入读入内存、或者写入硬盘
    res=f.read()
    print(type(res))
    print(res)
    # 3、关闭文件
    f.close() # 回收操作系统资源
    print(f)
    f.read() # 变量f存在,但是不能再读了

    del f # 回收应用程序资源


     文件对象又称为文件句柄

    
    
    # with open('a.txt',mode='rt') as f1: # f1=open('a.txt',mode='rt')
    #     res=f1.read()
    #     print(res)
    
    # with open 中的 encoding如果不写utf-8的话,会用windows默认的gbk去解码就报错了
    with open('a.txt',mode='rt',encoding='utf-8') as f1,
            open('b.txt',mode='rt',encoding='utf-8') as f2:
        res1=f1.read()
        res2=f2.read()
        print(res1)
        print(res2)
    
        # f1.close()
        # f2.close()
        
    # 花飘万家雪
    # asdf asdf

    '''
    强调:t和b不能单独使用,必须跟r/w/a连用

    t文本(默认的模式)
    1、读写都以str(unicode)为单位的
    2、文本文件
    3、必须指定encoding='utf-8'

    '''
    # 没有指定encoding参数操作系统会使用自己默认的编码
    # linux系统默认utf-8
    # windows系统默认gbk
    with open('c.txt',mode='rt',encoding='utf-8') as f:
    res=f.read() # t模式会将f.read()读出的结果解码成unicode
    print(res,type(res))

    # 内存:utf-8格式的二进制-----解码-----》unicode
    # 硬盘(c.txt内容:utf-8格式的二进制)


    以t模式为基础进行内存操作

    1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
    with open('c.txt',mode='rt',encoding='utf-8') as f:
    print('第一次读'.center(50,'*'))
    res=f.read() # 把所有内容从硬盘读入内存
    print(res)

    # with open('c.txt', mode='rt', encoding='utf-8') as f:
    print('第二次读'.center(50,'*'))
    res1=f.read()
    print(res1)

     ===============案例==================

    inp_username=input('your name>>: ').strip()
    inp_password=input('your password>>: ').strip()
    
    # 验证    这里要强调这个分隔前要支掉空白部分,分隔后逐行读取,全读完没有才能判断是错误
    with open('user.txt',mode='rt',encoding='utf-8') as f:
        for line in f:
            # print(line,end='') # egon:123
    
            username,password=line.strip().split(':')
            if inp_username == username and inp_password == password:
                print('login successfull')
                break
        else:
            print('账号或密码错误')
    
    # your name>>: egon
    # your password>>: 123
    # login successfull

    应用程序====》文件
    应用程序====》数据库管理软件=====》文件

    2、w:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置

    with open('a.txt',mode='wt',encoding='utf-8') as f:
        ...
    
        f.write('擦勒
    ')     # 这个内容会写到a.txt这个文件中
    # f.read() # 报错,不可读

    强调1:
    在以w模式打开文件没有关闭的情况下,连续写入,新的内容总是跟在旧的之后
    with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒1 ')
    f.write('擦勒2 ')
    f.write('擦勒3 ')

    强调2:
    如果重新以w模式打开文件,则会清空文件内容
    with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒1 ')
    with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒2 ')
    with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒3 ')

    案例:w模式用来创建全新的文件
    文件文件的copy工具


    src_file=input('源文件路径>>: ').strip()
    dst_file=input('目标文件路径>>: ').strip()
    with open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1,
        open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2:
        res=f1.read()
        f2.write(res)
    
    # 源文件路径>>: a.txt
    # 目标文件路径>>: b.txt

    3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾
    with open('e.txt',mode='at',encoding='utf-8') as f:
    # f.read() # 报错,不能读
    f.write('擦嘞1 ')
    f.write('擦嘞2 ')
    f.write('擦嘞3 ')

    强调 w 模式与 a 模式的异同:
    1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
    2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后


    案例:a模式用来在原有的文件内存的基础之上写入新的内容,比如记录日志、注册
    注册功能

    name = input('your name>>: ')
    pwd = input('your password>>: ')
    with open('user.txt', mode='at', encoding='utf-8') as f:
        f.write('{}:{}
    '.format(name, pwd))
    # your name>>: json
    # your password>>: 123
    
    # user.txt文件内容
    egon:123
    jack:123
    alex:123
    json:123

    了解:+不能单独使用,必须配合r、w、a
    with open('g.txt',mode='rt+',encoding='utf-8') as f:
    # print(f.read())
    f.write('中国')

    with open('g.txt',mode='w+t',encoding='utf-8') as f:
    f.write('111 ')
    f.write('222 ')
    f.write('333 ')
    print('====>',f.read())


    with open('g.txt',mode='a+t',encoding='utf-8') as f:
    print(f.read())

    f.write('444 ')
    f.write('5555 ')
    print(f.read())

  • 相关阅读:
    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
    ABP .Net Core 日志组件集成使用NLog
    ABP .Net Core Entity Framework迁移使用MySql数据库
    ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Visual Studio 2019 Window Form 本地打包发布猫腻
    VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用
    ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed
    ABP .Net Core To Json序列化配置
    .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
  • 原文地址:https://www.cnblogs.com/xiao-zang/p/12487423.html
Copyright © 2011-2022 走看看