zoukankan      html  css  js  c++  java
  • 文件处理

    1.什么是文件

    文件是操作系统提供给用户/应用程序操作硬盘的一个虚拟单位

    (我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。)
    

    2.为何要用文件

    存取硬盘必须要使用文件

    3.如何用文件

    f = open(文件路径,打开模式)
    f.write(数据)
    f.close # 关闭文件

    绝对路径

    windows系统
    D:python38Docpython383
    C:ac
    ew.txt
    
    linux系统
    /a/b/c/d.txt
    
    file_path=r'C:ac
    ew.txt'
    file_path=r'/a/b/c/d.txt'
    

    相对路径

    cd.txt
    
    d.txt
    

    示范:

    r"D:python全栈15期day10a.txt"
    f = open(r"aaaa.txt", mode='rt',encoding='utf-8')
    res=f.read()
    print(res)
    f.close()
    
    
    
    f = open(r"aaaa.txt", mode='rb')
    res=f.read()
    
    # print(res,type(res))
    
    x=res.decode('utf-8')
    print(x)
    f.close()
    
    f=open('aaa.jpg',mode='rb')
    res=f.read()
    print(res)
    f.close()
    

    一: 控制文件读写操作的模式

    一: 控制文件读写操作的模式
    1.1: r, 只读模式(默认是r), 在文件不存在的时候会报错, 文件存在时文件指针跳到文件开头
    f = open('a.txt', mode='rt', encoding='utf-8')
    res = f.read()
    f.close()
    1.2: w, 只写模式[不可读, 不存在则创建;
    存在则会清空, 文件指针跳到开头]
    f = open('a.txt', mode='wt', encoding='utf-8')
    f.write('你好呀,哈哈
    ')
    f.write('hello
    ')
    f.close()
    1.3
    a, 只追加模式[在文件不存在时则会创建文件, 文件存在是也不会清空, 文件指针跳到文件开头]
    f = open('a.txt', mode='w', encoding='utf-8')
    f.write('jason:777
    ')
    f.write('lili:456
    ')
    f.close()
    
    总结: wa的异同
    相同点: 在打开了文件不关闭的情况, 连续的写入, 新的内存永远跟在老内容之后
    不同点: 重新打开了文件, w会清空老的文件, 而a模式会保留老的内容并且指针跳到文件末尾
    

    示范:

    inp_name = input("your name:").strip()
    inp_pwd = input("your password:").strip()
    f = open('a.txt', mode='rt', encoding='utf-8')
    for line in f:
       user, pwd = line.strip().split(":")
       if inp_name == user and inp_pwd == pwd:
          print('login successful')
          break
    
       else:
          print('user or password error')
    f.close()
    

    二.控制文件的读写内容的模式

    1.1
    t, 默认: 读写都是以str类型, 一定要指定encoding

    f = open('a.txt', mode='rt', encoding='utf-8')
    f.read()
    f.close()
    1.2
    

    b, 读写都是以bytes为单位, 一定不能指定encoding参数

    f = open('a.txt', mode='rb', encoding='utf-8')
    data = f.read()
    print(data.decode('utf-8'))
    f.close()
    

    "+",表示可以同时读写
    r +
    w +
    a +

    示范:
    文件拷贝程序

    src_file = input("源文件路径:").strip()
    dst_file = input('新文件路径:').strip()
    with open(r"%s" % src_file, mode='rb')as f, 
          open(r'%s' % dst_file, mode='wb')as t:
       for line in f:
          t.write(line)
    

    操作文件的方法

    f.read()  # 读取所有内容,光标移动到文件末尾
    f.readline()  # 读取一行内容,光标移动到第二行首部
    f.readlines()  # 读取每一行内容,存放于列表中
    
    f.write('111
    222
    ')  # 针对文本模式的写,需要自己写换行符
    f.write('111
    222
    '.encode('utf-8'))  # 针对b模式的写,需要自己写换行符
    f.writelines(['111
    ', '222
    '])  # 文本模式
    f.writelines([bytes('333
    ', encoding='utf-8'), '444
    '.encode('utf-8')])  # b模式
    

    了解操作;

    f.readable()  # 文件是否可读
    f.writable()  # 文件是否可写
    f.closed()  # 文件打开模式如果为b,则没有属性
    f.flush()  # 立刻将文件内容从内存刷到硬盘
    

    三.with上下文管理

    在操作完毕文件后,一定要记住f.close(),虽然我们如此强调,但是大多数读者还是会不由自主地忘记f.close(),考虑到这一点,python提供了with关键字来帮我们管理上下文

    with open('a.txt', 'w')as f:
       pass  # 在执行完子代码块后,with 会自动执行f.close()
    

    可用with同时打开多个文件,用逗号分隔开

    with open('a.txt', 'w')as f, open('b.txt', 'w')as t:
       data = f.read()
       t.write(data)
    

    四.控制文件内指针移动

    控制文件内指针移动都是以字节为单位的
    只有一种特殊情况, t模式下的
    read(n), 代表的是n个字符, 此外代表的全部都是字节

    with open('a.txt', mode='rt', encoding='utf-8')as f:
       data = f.read(6)  # 6个字符
       print(data)
    
    with open('a.txt', mode='rb')as f:
       data = f.read(6)  # 6个字符
       data = f.read(8)  # 8个字符
       print(data.decode('utf-8'))
    
    f.seek(n, 模式)  # n代表的移动的字节个数
    

    模式
    0模式:参照文件的开头开始移动(只有0模式可以在t下使用,1和2 模式只能在b模式下使用)

    with open('a.txt',mode='rt',encoding='utf-8')as f:
       f.seek(5,0)
       print(f.tell())
       print(f.read())
    

    1模式:参照指针当前所在位置

    with open('a.txt',mode='rb')as f:
       f.seek(3,1)
       print(f.read().decode('utf-8'))
    

    with open('a.txt',mode='r+t',encoding='utf-8') as f:
    print(f.writable())
    f.seek(7,0)
    f.write('SB')

    with open('a.txt',mode='r+t',encoding='utf-8') as f:
    f.seek(3,0)
    f.write('h')

    由上例得出结论:硬盘都是用新内容覆盖旧内容,没有修改的概念,但是内存是可以修改的
    如何修改文件:
    思路:把硬盘的内容先读入内存,然后在内存中修改完毕后,再覆盖会硬盘

    五.文件修改的两种方式

    方式一:
    步骤:
    1、先将硬盘中文件的内容全部读入内存,然后在内存中修改完毕得到一个修改好的结果
    2、将修改的结果覆盖回原文件

    优点: 不耗费硬盘
    缺点:耗费内存

    with open('a.txt',mode='rt',encoding='utf-8') as f1:
        data=f1.read()
        res=data.replace('lxx','SB')
    
    with open('a.txt',mode='wt',encoding='utf-8') as f2:
        f2.write(res)
    

    方式二:
    步骤:
    1、循环读取源文件内容,一行行修改一行行写入一个新的临时文件
    2、删除源文件
    3、将临时文件重命名为源文件名

    优点:节省内存
    缺点:耗费硬盘空间

    import os
    with open('a.txt',mode='rt',encoding='utf-8') as f1,
            open('.a.txt.swp',mode='wt',encoding='utf-8') as f2:
        for line in f1:
            res=line.replace('SB','lxx')
            f2.write(res)
    
    os.remove('a.txt')
    os.rename('.a.txt.swp','a.txt')
    
  • 相关阅读:
    多线程系列 线程池ThreadPool
    多线程系列 使用多线程的安全问题
    C#反射Assembly 详细说明
    Assembly(c#中简单说明[转]
    反射调用性能比较
    MFC控件GDI编程
    MFC控件第一讲.DC编程
    MFC原理第六讲.消息传递
    MFC原理第五讲.消息映射.以及如何添加消息
    MFC原理第四讲.动态创建机制
  • 原文地址:https://www.cnblogs.com/lgh8023/p/13307257.html
Copyright © 2011-2022 走看看