一、文件的类型
1、文本文件
(1)文本文件一般由单一特定编码的字符组成(如UTF-8编码),内容容易统一展示和阅读。
(2)大部分文本文件都可以通过文本编辑软件或文字处理软件创建、修改和阅读。
(3)由于文本文件存在编码,所以它也可以被看作是存储在磁盘上的长字符串,如一个txt格式的文本文件。
(4)文本文件本质上还是二进制文件,例如Python的源程序。
2、二进制文件
(1)二进制文件直接由比特0和比特 1组成,没有统一的字符编码,文件内部数据的组织格式与文件用途有关。
(2)二进制文件是信息按照非字符但有特定格式形成的文件,如png格式的图片文件、avi格式的视频文件。
(3)二进制文件和文本文件最主要的区别在于是否有统一的字符编码。进制文件由于没有统一的字符编码,只能当作字节流,而不能看作是字符串。
(4)二进制文件保存的内容不是给人直接阅读的,而是提供给其它软件使用的,不能使用文本编辑软件查看(例如图片文件、音频文件、视频文件)。
(5)在计算机中,文件是以二进制的方式保存在磁盘上的。
二、文件的基本操作
1、操作文件的流程
(1)打开文件。
(2)读、写(操作)文件:
①读:将文件内容读入内存。
②写:将内存内容写入文件。
(3)关闭文件。
2、文件的打开和关闭
(1)Python通过open函数打开一个文件(如果文件不存在将会抛出异常),并返回一个操作这个文件的变量,语法形式如下:
<变量名>=open(<文件路径及文件名>,<打开模式>)
(2)open函数默认以只读方式打开文件(且默认为文本模式),常用的文件打开模式如下(打开模式使用字符串方式表示)。
补充:
①x:创建写模式,文件不存在则创建,存在则返回异常FileExistsError。b:二进制文件模式。t:文本文件模式(默认值)。
②文件指针:标记从哪个位置开始读取数据。
③频繁地移动文件指针,会影响文件的读写效率,开发中更多的时候会以只读、只写的方式来操作文件。
(3)文件使用结束后要用close方法关闭,释放文件的使用授权,语法形式如下:
<变量名>.close()
3、操作文件的函数/方法
(1)文件读取方法:
方法 | 含义 |
f.read(size=-1) | 从文件中读入整个文件内容;参数可选,如果给出,读入前size长度的字符串或字节流 |
f.readline(size=-1) | 从文件中读入一行内容;参数可选,如果给出,读入该行前size长度的字符串或字节流 |
f.readlines(hint=-1) | 从文件中读入所有行,以每行为元素形成一个列表;参数可选,如果给出,读入hint行 |
f.seek(offset) | 改变当前文件操作指针的位置,offset取0为文件开头,offset取2为文件结尾 |
①read方法可以一次性读入并返回文件的所有内容,read方法执行后会把文件指针移动到文件的末尾。(如果执行了一次read方法读取了所有内容,那么再次调用read方法,将不能够获得到内容,因为第一次读取之后,文件指针移动到了文件末尾,再次调用不会读取到任何的内容)
# 1. 打开 - 文件名需要注意大小写
file = open("README")
# 2. 读取
text = file.read()
print(text)
# 3. 关闭
file.close()
②readline方法可以一次读取一行内容,方法执行后,会把文件指针移动到下一行,准备下一次读取。(对于read方法,如果文件太大,一次性读入文件会对内存的占用非常严重,readline方法可以避免这个问题)
# 打开文件
file = open("README")
while True:
# 读取一行内容
text = file.readline()
# 判断是否读到内容
if not text:
break
# 每读取一行的末尾已经有了一个 `\n`
print(text, end="")
# 关闭文件
file.close()
(2)文件写入方法:
方法 | 含义 |
f.write(s) | 向文件写入一个字符串或字节流 |
f.writelines(lines) | 将一个元素为字符串的列表整体写入文件 |
# 打开文件
f = open("README", "w")
f.write("hello python!\n")
f.write("今天天气真好")
# 关闭文件
f.close()
4、文件读写案例——复制文件
(1)小文件复制:打开一个已有文件,读取完整内容,并写入到另外一个文件。
# 1. 打开文件
file_read = open("README")
file_write = open("README[复件]", "w")
# 2. 读取并写入文件
text = file_read.read()
file_write.write(text)
# 3. 关闭文件
file_read.close()
file_write.close()
(2)大文件复制:打开一个已有文件,逐行读取内容,并顺序写入到另外一个文件。
# 1. 打开文件
file_read = open("README")
file_write = open("README[复件]", "w")
# 2. 读取并写入文件
while True:
# 每次读取一行
text = file_read.readline()
# 判断是否读取到内容
if not text:
break
file_write.write(text)
# 3. 关闭文件
file_read.close()
file_write.close()
三、文件/目录的常用管理操作
在终端/文件浏览器中可以执行常规的文件/目录管理操作,例如:创建、重命名、删除、改变路径、查看目录内容、……
在Python中,如果希望通过程序实现上述功能,需要导入os模块
1、文件操作
2、目录操作
注:文件或者目录操作都支持相对路径和绝对路径
四、数据组织的维度
1、一维数据
(1)一维数据由对等关系的有序或无序数据构成,采用线性方式组织,对应于数学中数组的概念。
(2)在Python中,主要采用列表形式表示一维数据。
list = ["2005","08","03"]
(3)一维数据的文件存储有多种方式,总体思路是采用特殊字符分隔各数据,常见的存储方法有以下四种:
①采用空格分隔元素。
②采用逗号分隔元素。(该格式被称为CSV格式,比较常用)
③采用换行分隔元素。
④采用其它特殊符号(如分号)分隔元素。
list = ["2005","08","03"]
f = open("date.csv","w")
f.write(",".join(list)+"\n") # 用逗号分隔列表list的每个元素
f.close()
(4)要对一维数据进行处理,首先需要从CSV格式文件读入一维数据,并将其表示为列表对象。需要注意的是,从CSV文件中获得内容时,最后一个元素后面包含了一个换行符“\n”,对于数据的表达和使用来说,这个换行符是多余的,可以使用字符串的strip方法去除。
f = open("date.csv","r")
list = f.read().strip('\n').split(",") # 先去掉尾部的换行符,再根据逗号分隔符还原文件中的数据,将它们制作成列表
f.close()
print(list)
2、二维数据
(1)二维数据又称表格数据,由关联关系数据构成,采用二维表格方式组织,对应于数学中的矩阵。
(2)二维数据由多个一维数据构成,可以看作是一维数据的组合形式,因此二维数据可以采用二维列表来表示,即大列表中的元素为小列表,大列表的每个元素对应二维数据的一行,这个元素本身也是列表类型,其(小列表)内部各元素对应这行中的各列值。(在C语言中被称为二维数组)
list = [
['奇妙大营救','2022.07.15']
['勇闯四季城','2023.01.06']
['遨游神秘洋','2023.07.06']
]
(3)二维数据由一维数据组成,用CSV格式文件存储,CSV文件的每一行是一组一维数据,整个CSV文件是一个二维数据。
list = [
['奇妙大营救','2022.07.15']
['勇闯四季城','2023.01.06']
['遨游神秘洋','2023.07.06']
]
f = open("date.csv","w")
"""
list是大列表,for循环遍历大列表,每次循环中row都取list中的一组一维数据
将每次取出的一维数据都使用join方法改造为用逗号分隔各数据的字符串,写入文件中
每写一组一维数据就要写一个换行符
"""
for row in list:
f.write(",".join(row) + "\n")
f.close()
(4)要对二维数据进行处理,首先需要从CSV格式文件读入二维数据,并将其表示为列表对象。
f = open("date.csv","r")
list = [] # 创建空列表,用于存放读入的二维数据
for line in f:
list.append(line.strip('\n').split(",")) # 逐行读入,先去掉尾部的换行符,再根据逗号分隔符还原当前行的一维数据,将它们制作成一维列表存进二维列表list中
f.close()
print(list) # 直接打印二维列表
# 以表格的形式打印二维数据
for row in list:
line = ""
for item in row:
line += "{:10}\t".format(item) # 制表(对齐各数据)
print(line) # 逐行打印
3、高维数据
(1)高维数据由键值对类型的数据构成,采用对象方式组织,可以多层嵌套。
(2)高维数据相比一维数据和二维数据,能表达更加灵活和复杂的数据关系。