Python文件操作

在python中的文件操作

1.计算机的冯诺依曼体系:

迄今为止,计算机对文件的处理依旧遵循着冯诺依曼体系:
[外链图片转存失败(img-jKPJzqex-1563624352935)(en-resource://database/1710:1)]

  • 输入设备(Input equipment) :
    输入信息,让计算机接收。

  • 输出设备(Output equipment) :
    计算机经输出设备,将在内部的运算结果输出出来。

    <输入设备和输出设备合称计算机的IO设备>

  • 储存器(Memory):
    存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息。

  • 运算器(Datapath):
    拿到数据后对其进行各种算术运算和逻辑运算,即对数据进行加工和处理。

  • 控制器(Control):
    是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。

    IO编程中,Steam(流)是一个很重要的概念,可以想象成一个水管,数据(data)就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对浏览网页来说,浏览器和服务器至少要建立两根水管,才可以既能发数据,又能接收数据。
    由于CPU和内存的速度远远高于外设的速度,所以在IO编程中,就存在速度严重不匹配的问题。举个例子:我们要把100M的数据写入磁盘,CPU输出100M的数据只用0.01秒,可磁盘要接收这100M数据可能需要10秒,那怎么办?这里有同步IO和异步IO两种模式:
    第一种就是CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO;
    另一种方法是CPU不等待,只是告诉磁盘,“你先慢慢写,不着急,我先处理别的事了”,于是,后续的代码可以立刻执行下去,这种模式称为异步IO。

    2.在Pycharm中对文件的操作

    2.1 操作流程

    open 函数 -> 文件句柄 ->进行文件操作 ->关闭文件
    可以理解为先用open函数打开文件,接着获取文件句柄(一个文件只能有一个文件句柄),然后对文件进行操作,操作完文件后将其关闭。

    2.2 open()函数

    我们要先用Python内置open()函数打开一个文件,创建一个file对象,对文件操作的相关方法才可以调用他进行操作。语法如下:

file object = open(file_name, access_mode,coding )

各个参数的细节如下:
file object:你起的变量名,用于接收打开文件的对象,可以理解为文件句柄的持有者。
file_name:包含了你要访问的文件名的字符串。
access_mode:决定了打开文件的模式:包含只读、写入、追加等。所有的值见下图所示,这个参数是非强制的,默认文件访问模式为只读®。
coding:你所用的编码方式。
这三个是最主要也是必要的参数

不同模式打开文件的作用:

模式作用描述
r以只读的模式打开文件,文件的光标会在文件的开头,这是默认模式
rb以二进制格式打开一个文件用于只读。文件光标将会放在文件的开头
r+打开一个文件用于读写。文件的光标将会放在文件的开头
rb+以二进制格式打开一个文件用于读写。文件光标将会放在文件的开头
w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,将创建新文件
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
a打开一个文件用于追加。如果该文件已存在,文件光标将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
a+打开一个文件用于读写。如果该文件已存在,文件光标将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件光标将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件光标将会放在文件的结尾。如果该文件不存在,创建新文件用于读写

补充:在文本模式下,用’r’和’w’模式,不用编码和解码。但是在非文本文件下,比如视频、音乐等,用’wb’和’rb’,因为用’w’'r’是操作不了的。看见带’b’的都是处理的非文本

2.3 对文件进行读操作

2.3.1 read()方法
我们可以在源程序的同级目录创建一个文件:这里创一个“过零丁洋.txt”如图1所示:
在这里插入图片描述
假设我们自己就在txt文件中写了一句“人生自古谁无死,留取丹心照汗青。”
我们在test.py中写代码:

            f = open('过零丁洋.txt',mode='r',encoding='utf8')
            data = f.read()     #也可以read(5),读取5个字节,运行结果会是5个字
            print(data)
            f.close()
  • 注意:文件名处实际上是写文件的路径,它有绝对路径和相对路径两种。绝对路径是找到它在磁盘的准确位置,在我这是“E:\Txtoption\1\过零丁洋.txt”,是查找文件的最快方式。相对路径是相对于此程序文件的位置,此处是在同级目录所以直接写文件名称就可完成查找,在以后做项目对接时大部分要用相对路径。

  • mode = ‘r’ 可以简写成 ‘r’,Pycharm会自动识别。在写’ utf-8 ’ 时也可以简写为’utf8’
    运行结果如图2:
    在这里插入图片描述

2.3.2 readline()和readlines()

  • readline()方法

现在我们将整首诗补全,打开"过零丁洋.txt":

      辛苦遭逢起一经,干戈寥落四周星。
      山河破碎风飘絮,身世浮沉雨打萍。
      惶恐滩头说惶恐,零丁洋里叹零丁。
      人生自古谁无死?留取丹心照汗青。

然后我们在test.py中改写代码:

       f = open('过零丁洋.txt',mode='r',encoding='utf8')
      data = f.readline()     
      print(data)
      f.close()

结果是第一句,显然这个方法是读取文件第一句。但我们来思考一下,我们在关闭文件之前,再对文件进行读行操作会怎么样,会是从文章开头开始读吗?我们来看一下:

       f = open('过零丁洋.txt',mode='r',encoding='utf8')
       print(f.read())
       print(f.read())
       f.close()
            

结果如图3所示:
在这里插入图片描述
为什么会接着上一次读的地方往下读呢?等下讲到seek()和tell()函数时再做解释。

  • readlines()方法
    我们改写代码:
       f = open('过零丁洋.txt',mode='r',encoding='utf8')
       print(f.readlines())
       f.close()

运行出的结果是一个含有转义符的列表,每句诗都是一个表项。所以我们每次打印出来诗句越多为什么会有那么多空行。我们可以用之前对字符串操作的方法去空格, strip()方法。大家自己试试。

2.3.3 读写’r+'和读二进制’rb’

  • 读写’r+'
    更改代码:
      f = open('过零丁洋.txt',mode='r+',encoding='utf8')
      print(f.readline())
      f.write('hello')
      f.flush()           ##及时对文件刷新
      f.close()

运行后我们会发现,这种模式既可以读又可以写,而且写的内容在文件末尾。这里我要给大家补充一点。我们先进行读操作,此时后面的写操作默认在文件末尾。如果我们没读直接写的话,UTF-8编码将会按照三个字符为一个文字将内容放在开头,不管写多少次都是从开头写,而且是覆盖式的写。如果我们写进去两个字符,原文件开头是文字的话,则会造成乱码:前两个是字符,第三个是个乱码字符。不要慌,咱们清楚是怎么回事。

  • 读二进制’rb’
    先讲一下’rb‘是对文件进行二进制的读取,在对非文本类型文件操作时较为常用。’rb+‘同理,后面不做解释。
    我们先将古诗恢复一下然后修改代码:
        f = open('过零丁洋.txt',mode='rb')
        data = f.readline()     
        print(data)                 ##先看一下二进制的形式
        print(data.decode('utf8').strip())  ##将其以utf8方式解码出来打印
        f.close()

这里的读操作是对二进制数据进行解码 (decode),后面讲到的写操作是对二进制数据的文件编码写入内容 (encode)

2.4 对文件进行写操作

2.4.1 write()方法

  • 修改功能:当我们进行写操作的时候,会将原文件的内容清空并将我们写的内容加进去。
      f = open('过零丁洋.txt',mode='w',encoding='utf8')
      f.write('我是社会王!')               
      f.flush()
      f.close()

文件结果如图4所示:
在这里插入图片描述

  • 创建功能:我们的写操作会创建出原本没有的新的文件对象并进行写操作,假设我们想操作事先没有创建的文件’文天祥.txt’
  f = open('文天祥.txt',mode='w',encoding='utf8')
      f.write('我是文天祥!')               
      f.flush()
      f.close()

我们会发现pycharm在同级目录给我们创建了原本没有的文件”文天祥.txt“并写入内容。
2.4.2 读写’w+'和二进制写’wb’

  • 读写’w+'
    更改test.py代码:
 f = open('过零丁洋.txt',mode='w+',encoding='utf8')
      f.write('我现在不是社会王!')
      print(f.read().strip())
      f.flush()
      f.close()

进行覆盖写,但为什么读出来的内容什么都没有呢???因为当写操作进行完后,对文件操作的光标seek()已经走到末尾,我们读是从末尾开始读,所以读不到任何东西。如果我们将打印读操作上一步加一行代码:f.seek(0),将光标移动到开头就可以正常读了。

  • 二进制读写’wb’
 f = open('文天祥.txt',mode='wb')
      f.write('我身世浮沉啊!'.encode('utf8'))
      f.flush()
      f.close()

对二进制数据的文件编码写入内容 (encode) 编码转换写进去。'wb+'同理。

2.5 对文件进行追加操作

类似于写操作,不过是在文件末尾追加,不用像’w’操作那样破坏原来的文件。
2.5.1 追加’a’
顾名思义,就是在文件末尾追加内容

f = open('文天祥.txt',mode='a',encoding='utf8')
f.write('我怀才不遇啊!')
f.flush()
f.close()

结果我们会发现文件末尾会增加我们输入的,之前的内容没有任何改变。
2.5.2 追加’a+'读写

f = open('文天祥.txt',mode='a+',encoding='utf8')
f.write('\t我不开心!')
print(f.tell())
f.seek(0)
print(f.read().strip())
f.flush()f
.close()

这里我们还是正常操作,但是新加入了tell()和seek().来告诉我们光标走到多少字节了,以及重新定位。实现读取出数据。
2.5.3 'ab’和’ab+'就不做过多代码演示了,和上面原理一样。

2.6 tell()、seek()和flush()
  • 文件对象的内置函数tell(),可以实时向我们报告光标所在的位置,这样我们可以清晰的了解文件操作到哪里,不至于我们接下来的操作会让自己大吃一惊。
  • 文件对象内置函数seek(),可以将光标定位到我们想要其所在的字节地。可以准确的使我们的操作进行。
  • flush()函数作用是文件操作结束时及时刷新文件,通常用于文件的写入后的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值