Python第九章 文件操作

第九章 文件操作

9.1 文件概述

9.1.1 文件的编码

编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容

image-20230926215346670

为什么要使用编码:计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中。同时也需要编码, 将计算机保存的0和1,反向翻译回可以识别的内容。


计算机中有许多可用编码:UTF-8、GBK、Big5等。不同的编码,将内容翻译成二进制也是不同的。

【说明】GBK是过去中文常用的编码,以及Big5是繁体的编码。现在UTF-8已经包括了中文,所以以后文件读取时的打开操作大都使用UTF-8即可

编码有许多,所以要使用正确的编码, 才能对文件进行正确的读写操作呢。

image-20230926215549747 image-20230926215554046

如上,如果你给喜欢的女孩发送文件,使用编码A进行编码(内容转二进制)。女孩使用编码B打开文件进行解码(二进制反转回内容)

【理解】这里说一下我的理解,文本程序打开文件时,都是从硬盘上打开,读取的也都是01二进制文件,经过文本程序按照编码规则翻译之后才形成了看到的文本。程序在操作文件的时候,都是从二进制文件开始


可以使用Windows系统自带的记事本,打开文件后,即可看出文件的编码是什么:

image-20230926215821798

【再次强调】UTF-8是目前全球通用的编码格式。除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。

9.1.2 什么是文件

内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。

一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。

9.2 文件操作

在日常生活中,文件操作主要包括打开、关闭、读、写等操作。

9.2.1 打开、关闭文件

操作 功能
文件对象 = open(file, mode, encoding) 打开文件获得文件对象
文件对象.close() 关闭文件对象
with open() as f 通过with open语法打开文件,可以自动关闭
  • 以读方式打开文件时,如果文件不存在,会报错

9.2.1 读操作

操作 功能
文件对象.read([num]) 读取指定长度字节,不指定num读取文件全部
文件对象.readline() 读取一行
文件对象.readlines() 读取全部行,得到列表
for line in 文件对象 for循环文件行,一次循环得到一行数据

【说明】文件读取也就这四种方式了

下面逐一展示

使用的文件是D:/test.txt,里面的内容是

第一行内容:1234567
第二行内容:7654321
第三行内容:abcdefg
第四行内容:gfedcba
第五行内容:一二三四五六七
第六行内容:七六五四三二一
第七行内容:一去二三里
第八行内容:八九十枝花

1、文件对象.read(num)、文件对象.read()

f = open("D:/test.txt", "r", encoding="UTF-8")
# print(f)  # <_io.TextIOWrapper name='D:/test.txt' mode='r' encoding='UTF-8'>
# print(type(f))  # <class '_io.TextIOWrapper'>

print(f"读取10个字节的内容:{f.read(10)}")
print(f"再读取全部的内容:{f.read()}")

输出的内容为

读取10个字节的内容:第一行内容:1234
再读取全部的内容:567
第二行内容:7654321
第三行内容:abcdefg
第四行内容:gfedcba
第五行内容:一二三四五六七
第六行内容:七六五四三二一
第七行内容:一去二三里
第八行内容:八九十枝花

【说明】

  1. 一个汉字,一个中文符号,一个数字都是一个字节
  2. 读取文件的时候是有指针的,本次读取只能从上一次读取到的位置开始读取

2、文件对象.readlines()

f = open("D:/test.txt", "r", encoding="UTF-8")
lines = f.readlines() # <class 'list'>
print(type(lines))
for line in lines:
    print(line)   # 每一行都打印,注意每一行的内容后面有一个\n,print之后也会有换行,因此会有两个换行

输出效果为,中间隔着一行

第一行内容:1234567

第二行内容:7654321

第三行内容:abcdefg

readlines()与read()共享指针

f = open("D:/test.txt", "r", encoding="UTF-8")
f.read()
lines = f.readlines()
print(lines) # [], read()已经将指针移到了最后了

3、文件对象.readline()

这个只读取一行

f = open("D:/test.txt", "r", encoding="UTF-8")
line = f.readline()
print(line)  # 第一行内容:1234567

同样地,与read()共享指针

f = open("D:/test.txt", "r", encoding="UTF-8")
print(f.read(7))  # 第一行内容:1
print(f.readline())  # 234567

4、for遍历文件行

for in 文件的时候,每次都遍历一行

f = open("D:/test.txt", "r", encoding="UTF-8")
for line in f:  # 相当于for line in f.readlines()
    print(line, end='')

5、读取后注意文件的关闭

【说明】如果不关闭文件,那么文件会一直被Python程序打开,而不能操作


6、使用with open语法操作文件

使用这种方法操作文件,操作完之后可以自动关闭文件

with open("D:/test.txt", "r", encoding="UTF-8") as f:
    for line in f:
        print(line, end='')

# 文件会自动关闭

【理解】这种结构很合理,with open下面会有所进,说明下面一整筐的代码都属于操作文件的范围内

9.2.2 写操作

相关方法

操作 功能
f = open('python.txt', 'w') 以写的方式打开文件
文件对象.write("内容") 将内容写入到内存的缓冲区当中
文件对象.flush() 缓冲区的内容写入到硬盘当中
f.close() 关闭文件,自带flush()操作
  • 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
  • 调用flush的时候,内容会真正写入文件
  • 这样做(不是write的时候写入硬盘)是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
  • close函数自带了flush方法,也就是说close文件的时候也会执行flush操作
  • 当程序结束的时候,会自动执行close关闭文件,还是建议文件使用结束之后就关闭文件

下面逐一演示

1、以w方式打开文件

  • 如果文件不存在,会创建新文件
  • 如果文件存在,会将原有内容清空
f = open("D:/test.txt", "w", encoding="UTF-8")

2、文件对象.write(),而不flush()

import time

f = open("D:/test.txt", "w", encoding="UTF-8")
f.write("hello,world")  # 仅仅写到了内存当中
time.sleep(500000)  # 暂停,不关闭文件

会发现文件创建了,但是里面并没有内容,因为并没有将文件写入到硬盘当中,文本程序读取文件是从硬盘读取的

【说明】write是不带换行的,如果要换行,要自动添加\n符号

3、文件对象.write(),flush()

f = open("D:/test.txt", "w", encoding="UTF-8")
f.write("hello, world")
f.write("hello, world2")
f.flush()  # 写入到硬盘当中
f.close()

4、close()自带flush()

执行文件对象.close()的时候会自动执行flush()操作

9.2.3 追加操作

操作 功能
f = open('python.txt', 'a') 以追加的方式打开文件
文件对象.write("内容") 将内容追加内存的缓冲区当中
文件对象.flush() 缓冲区的内容写入到硬盘当中
f.close() 关闭文件,自带flush()操作

1、f = open('python.txt', 'a') 追加方式打开文件

  • a模式,文件不存在会创建文件
  • a模式,文件存在会在最后,追加写入文件

2、文件对象.write()、文件对象.flush()

同样的,只有flush之后才能写入到文件中

f = open("D:/test.txt", "a", encoding="UTF-8")
f.write("\nhello, worl5")
f.write("\nhello, world10")
f.flush()
f.close()

【说明】write同样没有换行操作,如果要换行,可以自行在前面添加\n操作


【下面演示一个复制操作】

src_file = open("D:/test.txt", "r", encoding="UTF-8")
dst_file = open("D:/bill.txt", "w", encoding="UTF-8")
dst_file.write(src_file.read())
dst_file.flush()
src_file.close()
dst_file.close()
posted @ 2023-10-07 11:37  Crispy·Candy  阅读(9)  评论(0编辑  收藏  举报