• Python之文件操作


    一、文件操作基本流程

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

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

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

    #变量:f1_obj,f1_file,file,file_handle... 文件句柄。
    #open Python的内置函数,但是底层调用的windows系统的open功能,#open功能就是操作文件用的。
    #windows系统默认的编码方式gbk,linux,macos:utf-8.
    #流程: 1打开文件,产生文件句柄。
           2对文件句柄进行相应的操作。
           3,关闭文件。
    Python代码
    path 文件路径:d:护士空姐学生少妇联系方式.txt
    encoding编码方式:utf-8,gbk....
    mode 操作方式: 只读,只写,追加,读写,写读.....
    路径:绝对路径:从根目录开始一直找到文件。
    相对路径:从当前目录开始找到的文件。
    #1. 打开文件,得到文件句柄并赋值给一个变量
    f=open('a.txt',encoding='utf-8',mode= 'r') #默认打开模式就为r
    
    #2. 通过句柄对文件进行操作
    data=f.read()
    
    #3. 关闭文件
    f.close()

    二、文件的编码(凡是带b的模式encoding可以省略不写)

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

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

    三、文件的打开模式

    r、rb、r+、r+b;w、wb、w+、w+b;a、ab、a+、a+b模式(注意***代表必须熟练)

    #1. 打开文件的模式有(默认为文本模式):
    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    w,只写模式【不可读;不存在则创建;存在则清空内容】
    a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
    
    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
    rb 
    wb
    ab
    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
    
    #3,‘+’模式(就是增加了一个功能)
    r+, 读写【可读,可写】
    w+,写读【可写,可读】
    a+, 写读【可写,可读】
    
    #4,以bytes类型操作的读写,写读,写读模式
    r+b, 读写【可读,可写】
    w+b,写读【可写,可读】
    a+b, 写读【可写,可读】
    文件打开模式
    f1 = open('护士学生空姐班主任.txt', encoding='utf-8')
    print(f1.read())
    f1.close()
    
    # 1,  f.read() 全部读出来。
    # 2,  f.read(n)  n 是按照字符读取。
    # 3,  f.readline() 按行读取
    # 4,  f.readlines() 按行全部读取
    # 5,  for 循环去读取。
    f1 = open('护士学生空姐班主任.txt', encoding='utf-8')
    for line in f1:
         print(line)
    f1.close()
    ***r模式
    #r+ 读写,先读后写
    
    f1 = open('护士学生空姐班主任.txt', encoding='utf-8', mode='r+')
    print(f1.read())
    f1.write('666')
    f1.close()
    ***r+模式
    # rb模式 非文字类的文件
    
    
    ps 非文字的文件的读取写入
    f1 = open('11.jpg', mode='rb')
    content = f1.read()
    print(content)
    f1.close()
    f2 = open('小猪佩奇.jpg', mode='wb')
    f2.write(content)
    rb模式
    #r+b 读写,先读后写   在b模式下
    
    
    f1 = open('护士学生空姐班主任.txt', mode='r+b')
    print(f1.read())
    f1.write('666'.encode('utf-8'))
    f1.close()
    r+b模式
    # w 模式 写模式
    # w:没有文件,创建文件写内容。
    # w:如果有文件,清空原文件,写入新内容。
    
    f1 = open('log1', encoding='utf-8', mode='w')
    f1.write('老男孩是最好的培训学校...')
    f1.close()
    ***w模式
    #wb    b模式下写
    
    
    
    f1 = open('log2', mode='wb')
    f1.write('法国进口分类结果'.encode('utf-8'))
    f1.close()
    wb模式
    #w+ 先写后读
    
    
    f1 = open('log1', encoding='utf-8', mode='w+')
    f1.write('老老男孩.....')
    f1.seek(0)  # 调整光标
    print(f1.read())
    f1.close()
    w+模式
    #w+b模式  b模式下先写后读
    
    
    f1 = open('log1', mode='w+b')
    f1.write('老老男孩.....'.encode('utf-8'))
    f1.seek(0)  # 调整光标
    print(f1.read())
    f1.close()
    w+b模式
    # a:没有文件,创建文件写内容。
    # a:有文件,直接在原文件的后面追加新内容。
    
    f1 = open('log3', encoding='utf-8', mode='a')
    f1.write('barry')
    f1.close()
    ***a模式
    # ab模式    b模式下追加
    
    
    f1 = open('log3', mode='ab')
    f1.write('barry'.encode('utf-8'))
    f1.close()
    ab模式
    #a+模式  追加可读
    
    f1 = open('log3', encoding='utf-8', mode='a+')
    f1.write('范德萨急功近利开发工具')
    f1.seek(0)
    print(f1.read())
    f1.close()
    a+模式
    # a+b模式   b模式下追加可读
    
    f1 = open('log3', mode='a+b')
    f1.write('范德萨急功近利开发工具'.encode('utf-8'))
    f1.seek(0)
    print(f1.read())
    f1.close()
    a+b模式

    四、文件的操作方法

    1.常用的操作方法

     *r
                read
                read(n)
                # r模式:read(n) n 是按照字符读取。
                # rb模式:read(n) n 是按照字节读取。
                readline()
                readlines()
                for循环 最好的    
    # readable() 
    # writeable()判断是否可读或者可写
    f1 = open('log1', encoding='utf-8') print(f1.readable()) print(f1.writable()) f1 = open('log1', encoding='utf-8',mode='r+') print(f1.readable()) print(f1.writable())
    # seek: 按照字节去调整光标
    seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,
    但无论哪种模式,都是以bytes为单位移动的
    
    f1 = open('log1', encoding='utf-8')
    f1.seek(3)
    print(f1.read())
    f1.close()
    # tell 告诉光标的位置
    
    f1 = open('log1', encoding='utf-8')
    print(f1.tell())
    print(f1.read())
    print(f1.tell())
    f1.close()
    #truncate 对原文件进行截取内容,以字节形式,只能在a模式下使用。
    
    f1 = open('log1', encoding='utf-8', mode='a')
    f1.truncate(3)
    f1.close()
    #文件操作的另一种写法
    with open (path,encoding=,mode=) as 文件句柄
    
    
    with open('log1', encoding='utf-8') as f1,
        open('log2',encoding='utf-8', mode='w') as f2:
        print(f1.read())
        f2.write('666')

    五、文件的改

    步骤:

    1,打开原文件 old_file,将原内容读取到内存。
    2,创建一个新文件new_file。
    3,将原内容通过你改写形成新内容,写入到新文件。
    4,将原文件删除。
    5,将新文件重命名成原文件。

    例题:

    有如下文件:

    -------

    alex是老男孩python发起人,创建人。

    alex其实是人妖。

    谁说alex是sb?

    你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

    ----------

    将文件中所有的alex都替换成大写的SB。

    #方法一,原文件内容不打,可以用此方法,但是此方法还是很low。
    
    
    import os
    with open('change', encoding='utf-8') as f1,
        open('change.bak', encoding='utf-8', mode='w') as f2:
        old_content = f1.read()
        new_content = old_content.replace('SB', 'alex')
        f2.write(new_content)
    os.remove('change')
    os.rename('change.bak', 'change')
    # 方法2
    
    
    import os
    with open('change', encoding='utf-8') as f1,
        open('change.bak', encoding='utf-8', mode='w') as f2:
        for line in f1:
            new_line = line.replace('alex', 'SB')
            f2.write(new_line)
    os.remove('change')
    os.rename('change.bak', 'change')



  • 相关阅读:
    内核初始化. Part 4【转】
    fixmap addresses原理【转】
    linux内核调试项【转】
    Linux Suspend流程分析【转】
    Linux电源管理-Suspend/Resume流程【转】
    Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem【转】
    内核regmap机制【转】
    ARM NVIC控制器(基于cortex-M4)【转】
    Linux设备树语法详解-中断【转】
    [Go] 第一个单词首字母变大写:Ucfirst(),第一个单词首字母变小写:Lcfirst()
  • 原文地址:https://www.cnblogs.com/wj12312/p/9008456.html
Copyright © 2020-2023  润新知