1. 文件的基本操作
1.1 文件的打开和关闭
1.1.1 文件的打开
open()函数用于打开文件,该函数调用成功会返回一个文件对象。
常用的文件打开模式有r、w、a、b、+,这些模式的含义分别如下:
1.1.2 文件的关闭
关闭文件。关闭后文件不能再进行读写操作。
对文件进行读写操作后,关闭文件是一个很好的习惯。
关闭文件可以使用文件对象的close()方法实现。语法结构:
file.close()
file为打开的文件对象。
1.2 文件的读取和写入
1.2.1 文件的读取
read (size)方法:从指定文件中读取指定数据
参数size表示设置的读取数据的字节数,
若该参数缺省,则一次读取指定文件中的所有数据。
示例:
import os.path
file = open("resources/test.txt", mode="r")
print(file.read())
运行结果:
1.2.2 文件的写入
write(string)方法,从文件写入数据。
import os.path
file = open("resources/test.txt", mode="a")
file.write("aaa")
运行结果:
1.3 按行对文件进行读写
1.3.1 按行对文件进行写入
writelines()方法:
该方法需要通过制定一个字符串类型的列表,
该方法会将列表中的每一个元素值作为单独的一行写入文件。
import os.path
fo = open("resources/test.txt", "w")
print("读写的文件名:", fo.name)
seq = ["Hello\n", "life is short\n", "I want to learn python\n"]
line = fo.writelines(seq)
fo.close()
运行结果:
1.3.2 按行对文件进行读取
1.3.2.1 readline()方法
该方法返回一个字符串,用于文件指针当前位置读取一行文本,即遇到行结束符停止读取文本,但读取的内容包含了结束符。
示例:
import os.path
f = open("resources/test.txt")
while True:
line = f.readline()
if line == '':
break
else:
print(line)
f.close()
运行结果:
1.3.2.2 readlines() 方法
从文件指针当前的位置读取后面所有的数据,
并将这些数据按行结束符分隔后,放到列表中返回。
import os.path
f = open("resources/test.txt", "r")
datas = f.readlines()
print(datas)
print(type(datas))
for data in datas:
print(data)
f.close()
运行结果:
1.3.2.3 for循环
import os.path
f = open("resources/test.txt", "r")
for data in f:
print(data)
f.close()
运行结果:
1.3.2.4 消除多余的空白符
为何会出现这些空白行呢?因为在这个文件中,
每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,
因此每行末尾都有两个换行符:一个来自文件,另一 个来自print 语句。
要消除这些多余的空白行,可在print 语句中使用rstrip() :
import os.path
f = open("resources/test.txt", "r")
for data in f:
print(data.rstrip())
f.close()
**运行结果: **
1.4 使用fileinput对象读取大文件操作
如果需要读取一个大文件,使用readlines()方法会占用太多的内存,因为该方法会
一次性将文件的所有内容读取到列表中,列表中的数据都需要放到内存中,所有非常占
内存。为了解决这个问题,可以使用for循环和readline()方法逐行读取,也可以使用
fileinput模块中的input()方法进行读取。
input()方法返回一个fileinput对象,通过fileinput对象的相应方法可以对指定
文件进行读取,fileinput对象使用的缓存机制,并不会一次性读取所有文件的内容
所有比readlines()方法更节省内存资源
示例: 使用fileinput输出当前行号和行内容
import fileinput
for line in fileinput.input("resources/test.txt"):
line_no = fileinput.lineno()
print(line_no, line.rstrip())
运行结果: