• the day of python learning(文件)


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

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

    1. 打开文件,得到文件句柄并赋值给一个变量
    f=open('a.txt','r',encoding='utf-8') 默认打开模式就为r

    2. 通过句柄对文件进行操作
    data=f.read()

    3. 关闭文件
    f.close()

    关闭文件时,一种是关闭操作系统所打开的占内存的部分;另一种则是直接删除应用程序f文件

    f.close()

    del f  必须在close之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源。

    也可以用with关键字来帮我们管理上下文

    with open('a.txt','w') as f :

      pass

    with open('a.txt','r') as read_f, open('b.txt','w') as write_f : 

      data = read_f.read()

      write_f.write(data)

    文件的编码

    以什么编码方式储存,就以什么方式打开

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

    str------->>>byte encode 编码
    r = '任阳城是帅哥'
    s = r.encode('gbk') encode编码
    print(s)

    byte------>>str decode 解码
    t =s.decode('gbk')
    print(t)
    英文字符解码编码都可以,因为占的字节都为一
    s = 'abf'
    b = s.encode('utf-8')
    print(b)
    byte --->str decode 解码
    s1 = b.decode('gbk')
    print(s1)

    文件的操作

        a.txt
    1,文件路径:d:a.txt
    2,编码方式:utf-8 gbk 。。。。
    3,操作方式:只读,只写,追加,读写,写读.....
    以什么编码方式储存的文件,就得以什么编码打开进行操作。


    绝对路径与相对路径
    只读:r(文件必须存在,不存在则会异样)
    bytes ---->> str
    f = open('test',mode='r',encoding='utf-8')
    content = f.read()
    print(content,type(content))
    f.close()

    f = open('test',mode = 'rb',)
    content = f.read()
    print(content)
    f.close()

    只写:w(不可读,存在则清空内容再写,不存在则创建)
    wb
    先将源文件的内容全部清除,再写
    f = open('无',mode='w',encoding='utf-8')
    f.write('如果没有这个文件则创建,写的编码方式为utf-8')
    f.close()
    wb
    f = open('无',mode='wb')
    f.write('以字节的形式写入'.encode("utf-8"))
    f.close()
    r+ 读写
    r+b 读写(以bytes类型)追加读写

    f = open('log',mode='r+',encoding='utf-8')
    print(f.read())
    f.write('洋葱是笨蛋')
    f.close()

    f = open('log',mode='r+b')
    print(f.read())
    f.write('加油努力'.encode('utf-8'))
    f.close()

    只能追加a,ab(不可读;不存在则创建,存在则只追加内容
     f = open(log',mode='a,encoding = 'utf-8')
    f.write('我最帅')
    f.close()

    f = open('log',mode = 'a+b')
    f.write('我最帅'.encode('utf-8'))
    f.close()

    总结:

    带+可以读写,相当于多一个功能

    r+读写,w+写读,a+写读

    带b用于非字符文件的传输,保存。'b'表示将其以字节的形式存储,使用这种模式无需考虑文本文件的字符编码、图片文件的ipg格式、视频文件的avi格式

    rb,wb,ab

     注意点:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

    以bytes类型操作的可读可写追加模式

    r+b,w+b,a+b

    
    

    文件的操作方法

    4.1常用操作方法。

    read(3):

      1.文件打开方式为文本模式时,代表读取三个字符

      2.文件打开方式为非文本模式(b),代表读取三个字节

    其余的文件内光标移动都是以字节为单位的:

    如seek,tell,truncate

    注意点:

      1.seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论是哪种模式,都是以bytes为单位移动

      2.truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。

    操作函数:

    f.close()关闭文件

    f.next()获取下一行数据,不存在则报错

    f.read()读取指定字节数据

    f.readline()仅仅读取一行数据

    f.readlines()读取所有数据,并根据换行保存值列表

    f.seek()指定文件中指针位置

    f.tell()获取当前指针位置

    f.truncate()截断数据,仅保留指定之前的数据

    f.write()写数据

    f.writelines()将一个字符串列表写入文件

    f.xreadlines()可用于逐行读取文件,非全部

    f.readable()判断是否可读

    f.seekable()指针是否可操作

    f.writable()是否可写

    文件的修改

    文件的数据是存放在硬盘上的,因而只存在覆盖,不存在修改一说。

    文件是不可修改的,我们平时修改的只是系统模拟出来的效果

    方式一:

    将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕欧,再由内存覆盖到硬盘中(word,vim,nodpad++等编辑器)

    import os 

    with open('old') as read_file , open('new',mode = 'w') as write_file:

      data = read_f.read() #先全部读入内存,过大会造成系统卡死

      data = data.replace('原来的内容',’替换的内容‘)#在内存之后完成修改

      write_f .write(data)#一次性写入新的文件

    os.remove('old')#移除原文件

    os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果

    方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕后就写入新的文件中,最后用新文件覆盖旧的文件

    import os 

    with open('old') as read_file , open('new',mode = 'w') as write_file:

       for line in read_file:

        line = line.replace('原来的内容','替换的内容')

        write_f.write(line)   #这里调用for循环,一边替换一边进行写入

    os.remove('old')#移除原文件

    os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果

  • 相关阅读:
    流式布局思想 js函数的几种简写方式 面向对象 js vue引入bootstrap和jQuery环境
    04--CBV源码分析 Django的settings源码分析 模板层
    C#使用委托和事件来重写串口的接收数据方法DataReceived方法完成数据的接收处理
    自定义控件的封装、常用的鼠标事件的重载、定时器的使用、event事件以及事件过滤器、文件操作以及文本流和数据流的使用
    QT的优点、项目文件目录、main函数、QpushButton、对象树、Qt中坐标系、Qt中信号和槽、自定义信号和槽、信号和槽的拓展、Qt4版本中的信号和槽的缺点、Lambda表达式
    Stylet框架显示自定义界面的步骤
    MahApps.Metro使用
    async和await的使用
    第一个WPF程序(串口调试)
    结构、类、属性:以及面向对象的各种特性继承、封装、多态
  • 原文地址:https://www.cnblogs.com/wai-xin-ren/p/9495068.html
Copyright © 2020-2023  润新知