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

    一,文件操作基本流程

    计算机系统分为:计算机硬件,操作系统,应用程序三部分。

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

    有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

    #1. 打开文件,得到文件句柄并赋值给一个变量
    f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
    
    #2. 通过句柄对文件进行操作
    data=f.read()
    
    #3. 关闭文件
    f.close()

     可能出现的错误:

    1.UnicodeDecodeError:文件存储和打开的方式不一样

    2:路径中含有 , 时需要在路径之前添加r或者用\转义

    二,文件编码

    f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8

    #这就用到了字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
    f=open('a.txt','r',encoding='utf-8')

    三,文件的打开模式

    文件句柄 = open(‘文件路径’,‘模式’)

    E:\new.txt 绝对路径
    相对路径:同一个文件夹下的文件就是相对路径

    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】

    rb,一般用在非文字类型的文件:图片,视频  

      文件的下载和上传的功能用b模式

    r+,读写(先读,后写 ) r+b

    f = open('e:新建文本文档.txt','r+',encoding = 'utf-8')
    print(f.read())
    f.write('asdadd')
    f.close()

    五种读取模式:

    1、f.read() 全部读出来

    f = open('log',mode='r',encoding='utf-8')
    content = f.read(3) # r 模式:n 是按照字符读取
    print(content)
    f.close()
    f = open('log',mode='rb')
    content = f.read(5) # rb 模式:n 是按照字节读取
    print(content)
    f.close()
    # bytes ---> str
    s = b'xe4xb8xb0xe5x8e'.decode('utf-8')
    print(s)

    2、f.readline() 按行读

    f = open('log',encoding='utf-8')
    line = f.readline()
    print(line)
    line1 = f.readline()
    print(line1)
    f.close()

    3、f.readlines() 每一行作为一个元素放在列表中

    f = open('log',encoding='utf-8')
    lines = f.readlines()
    print(lines)
    f.close()

    4、 推荐方式:循环读取

    f = open('log',encoding='utf-8')
    for i in f:
        print(i)
    f.close()

    5、f.read(n)

    r模式按照字符的数目读取

    rb模式按照字节的数目读取

    f = open('e:新建文本文档.txt','r',encoding = 'gbk')
    content = f.read(3)
    print(content)
    f.close()

    补充:bytes-->str  一个汉字3个字节,4,5个会报错

    s = b'xe4xb8xb0.decode(''utf - 8')  print(s)  #丰

    f.write('laozhang')  若果没有文件,则创建文件写内容,如果有文件则将原文件删除,再写。

    f = open('log','w',encoding='utf-8')
    f.write('laozhang是sb')
    f.close()
    f = open('log1','w',encoding='utf-8')
    f.write('laozhang依然是sb')
    f.close()

    wb模式  需要将写入的字符串.encode转换成二进制,并添加编码

    写读w+  先写后读,f.seek(0)光标移动到开头

    f = open('log1','wb')
    f.write('laozhang依然是sb'.encode('utf-8'))
    f.close()

    追加

    只追加 a ab

    f = open('e:新建文本文档.txt','a',encoding = 'gbk')
    f.write('3')
    f.close()

    断点续传用到了tell和seek,都是按照字节去调整光标位置。

    .truncate截取,按照字节去截取。

    with open('log','r',encoding = 'utf-8') as f1:

      print(f1.read())

    方法汇总:

    def close(self, *args, **kwargs): # real signature unknown
            关闭文件
            pass
    
        def fileno(self, *args, **kwargs): # real signature unknown
            文件描述符  
            pass
    
        def flush(self, *args, **kwargs): # real signature unknown
            刷新文件内部缓冲区
            pass
    
        def isatty(self, *args, **kwargs): # real signature unknown
            判断文件是否是同意tty设备
            pass
    
        def read(self, *args, **kwargs): # real signature unknown
            读取指定字节数据
            pass
    
        def readable(self, *args, **kwargs): # real signature unknown
            是否可读
            pass
    
        def readline(self, *args, **kwargs): # real signature unknown
            仅读取一行数据
            pass
    
        def seek(self, *args, **kwargs): # real signature unknown
            指定文件中指针位置
            pass
    
        def seekable(self, *args, **kwargs): # real signature unknown
            指针是否可操作
            pass
    
        def tell(self, *args, **kwargs): # real signature unknown
            获取指针位置
            pass
    
        def truncate(self, *args, **kwargs): # real signature unknown
            截断数据,仅保留指定之前数据
            pass
    
        def writable(self, *args, **kwargs): # real signature unknown
            是否可写
            pass
    
        def write(self, *args, **kwargs): # real signature unknown
            写内容
            pass

    常用方法:

    read  readable readline readlines for循环

    seek tell write writeable

     改动文件:

    # 1,创建一个新文件.
    # 2,读取原文件.
    import os
    with open('log',encoding='utf-8') as f1,
        open('log.bak','w',encoding='utf-8') as f2:
        # 3,将原文件的内容通过你想要的方式进行更改,并写入新文件件.
        old_content = f1.read()
        new_content = old_content.replace('alex','SB')
        f2.write(new_content)
    #4,将原文件删除.
    os.remove('log')
    #5,将新文件重命名原文件名.
    os.rename('log.bak','log')
  • 相关阅读:
    LVS负载均衡
    Firewalld防火墙
    前端性能优化----yahoo前端性能团队总结的35条黄金定律
    如何做好工作?
    需求分析的故事——如何练就需求分析的火眼金晴?
    让技术人员看得懂的流程-----面向对象设计全流程概述
    关于RESTFul初步理解
    初步研究全文搜索的解决方案
    Artech的MVC4框架学习——第八章View的呈现
    Artech的MVC4框架学习——第七章Action的执行
  • 原文地址:https://www.cnblogs.com/strive-man/p/8386899.html
Copyright © 2011-2022 走看看