注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。
文件的类型
文件是数据的抽象和集合。文件是存储在辅助存储器上的数据序列。
文件是数据存储的一种形式。
文件展现形态:文本文件和二进制文件。
文本文件vs.二进制文件
文本文件和二进制文件只是文件的展示方式。
本质上所有文件都是以二进制形式存储的;形式上所有文件采用两种方式展示。
文本文件是由单一特定编码组成的文件,如UTF-8编码。
文本文件由于存在编码,所以也被看作是存储着的长字符串。在WINDOWS OS中,.txt文件、.py文件都是文本文件。
二进制文件是直接由比特0和1组成、没有统一编码的文件。一般存在二进制0和1的组织结构,即文件格式。比如.jpg文件、.avi文件等。
f.txt文件保存为:"中国是个伟大的国家!"
#文本形式打开文件
tf = open("f.txt", "rt")
print(tf.readline())
tf.close()
<<<中国是个伟大的国家!
#二进制形式打开文件
bf = open("f.txt", "rt")
print(bf.readline())
bf.close()
<<< #输出一段二进制代码
文件的打开和关闭
文件处理的步骤:打开-操作-关闭。
文件的占用状态和存储状态之间的转换用a = open(,)和a.close()来实现。
文件的读写
3个常用的读文件函数:
a.read(size)
a.readline(size)
a.readlines(hint)
3个常用的写文件函数:
a.write(s)
a.writelines(lines)
a.seek(offset)
文件的打开
<变量名> = open(<文件名>, <打开模式>)。
<文件名>——文件路径和名称,源文件同目录则可省略路径。
<打开模式>——文本或二进制。
<文件名>、相对路径和绝对路径
关于文件路径和名称,如果要使用的文件绝对路径是D:\PYE\f.txt,那么路径和文件名是:
"D:/PYE/f.txt"或"D:\\PYE\\f.txt",两个反斜杠是因为Python默认反斜杠为转义符。
除了绝对路径外,也可以使用相对路径——打开的文件与当前程序之间的路径。
如果当前程序存储在D:根目录下,则"D:/PYE/f.txt"的相对路径就是"./PYE/f.txt";如果打开的文件和程序在同一个目录里,那么就可以直接使用"f.txt"而不需要任何路径。
<打开模式>
Python有以下4种文件打开模式:
'r'——只读模式,默认值。如果文件不存在,则返回FilenNotFoundError错误。
'w'——覆盖写模式。文件不存在则创建;文件存在则完全覆盖。
'x'——创建写模式。文件不存在则创建;文件存在则返回FileExistError错误。
‘a'——追加写模式。文件不存在则创建;文件存在则在文件最后追加内容。
还有2种与打开文件相关的模式:
'b'——二进制文件模式。
't'——文本文件模式,默认值。
最后还有一种打开模式方式:
'+'——与r/w/x/a一同使用,在原功能基础上增加同时读写功能。
打开模式的一些例子:
f = open("f.txt") ——文本形式、只读模式、默认值
f = open("f.txt", "rt") ——文本形式、只读模式、同上默认值
f = open("f.txt", "w") ——文本形式、覆盖写模式
f = open("f.txt", "a+") ——文本形式、追加写模式+读文件
f = open("f.txt", "x") ——文本形式、创建写模式
f = open("f.txt", "b") ——二进制形式、只读模式
f = open("f.txt", "wb") ——二进制形式、覆盖写模式
文件的关闭
文件的关闭只有1种:
<变量名>.close() ——<变量名>文件句柄
文件内容的读取
Python提供了3种读取文件内容的方法。
以"中国是个伟大的国家!"为一个text文件为例来说明。
1)<f>.read(size = -1)——读入全部内容;如果给出参数,读入前size长度。
s = f.read(2) #s的数据类型是字符串,s是f文件里所有行的文本组成的字符串,每一行的结尾有个换行符\n,算作1个字符串。
<<<中国
2)<f>.realine(size = -1)——读入一行内容,如果给出参数,读入该行前size长度。
s = f.readline() #s的数据类型是字符串,s是文本中多行文本的第一行。
<<<中国是个伟大的国家!
3)<f>.realines(hint = -1)——读入文件所有行,以每一行为一个元素形成列表。如果给出参数,读入index=hint这个字符为止所有的行。
l = f.readlines() #l的数据类型是列表。其中每一行(字符串类型)都是l的一个元素。
<<<[中国是个伟大的国家!]
文件的全文本操作
遍历全文本之方法一
fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
txt = fo.read()
#对全文txt进行处理
fo.close()
遍历全文本之方法一的特点是一次读入,统一处理;其劣势是,如果一个文本太大,比如10TB,那么一次读入将会耗费大量的时间和运行资源。
如果遇到上述大文本情况,那么分批分阶段处理是一个有效的办法。
遍历全文本之方法二
fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
txt = fo.read(2)
while txt != "":
#对txt进行分批处理
txt = fo.read(2)
fo.close()
遍历全文本之方法二的特点是,按数量读入,逐步处理。这种方法对于处理大文件十分有效。
逐行遍历文件之方法一
fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
for line in fo.readlines():
print(line)
#每一行都被遍历出来,fo.readlines()形成一个列表,每一行line都属于字符串类型,同时也都是列表fo.readlines()的一个元素
fo.close()
逐行遍历文件之方法一的特点是,每一行都被遍历出来,fo.readlines()形成一个列表,每一行line都是字符串类型,也都是列表fo.readlines()的一个元素。
逐行遍历文件之方法二
fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
for line in fo:
print(line)
# 每一行都被遍历出来,逐行进行处理,不会生成列表。line的数据类型是字符串。
fo.close()
逐行遍历文件之方法二的特点是,每一行都被遍历出来,逐行进行处理,但不会生成列表。line的数据类型是字符串。
数据的文件写入
<f>.write(s)——向文件写入一个字符串或字节流。
f.write("中国是一个伟大的国家!")
<<< # 把"中国是一个伟大的国家!"这个字符串写入到了文件f当中。
<f>.writelines(lines)——将元素lines写入文件。lines可以是字符串,也可以是元素全为字符串的列表,写入以后,字符串之间将会被无缝连接起来。
l = ["中国", "法国", "美国"]
f.writelines(l)
<<<中国法国美国 #6个汉字之间没换行、空格和逗号
<f>.seek(offset)——改变当前文件操作指针的位置,offset含义如下:
0- 文件开头;1-当前位置;2-文件结尾。
f.seek(0) #光标回到文件开头
文件写入的一个例子如下:
fo = open("output.txt", "w+")
l = ["中国", "法国", "美国"]
fo.writelines(l)
for line in fo:
print(line)
fo.close()
<<< #竟然没有输出任何信息
若是加入一行:
fo = open("output.txt", "w+")
l = ["中国", "法国", "美国"]
fo.writelines(l)
fo.seek(0)
for line in fo:
print(line)
fo.close()
<<<<中国法国美国
输入有内容了。这是因为,之前输出为空,因为for line in fo使光标从写完的内容后面开始遍历的。fo.seek(0)解决了光标的位置问题,所以能输出内容。
文件读写操作时,一定要随时注意文件操作指针的位置。
文件中的with关键字
每次f.write或f.writelines之后,必须加上f.close()才能再去做其它操作,比如f.read()等读的操作。因为,f.close()相当于游戏里的save操作,把之前的缓冲区的数据写到硬盘上,且,通常采用with语句能保证系统自动关闭打开的流。
为了更简单地使用文件,Python提供了一个关键字:with。
在处理文件对象时,如果使用with关键字,当子句体结束后文件会正确关闭,无需加上f.close()语句,即使在某个时刻引发了异常。
with关键字用法实例如下:
with open('workfile') as f:
read_data = f.read()
To be continued.