作用
把数据存储起来,程序执行时可以直接使用,省时省力
基本操作
步骤
- 打开 open()
- 读read()/写write()
- 关闭 close()
open()
open(name,mode,encoding)
函数可以打开已经存在的文件,如果文件不存在,就创建一个新文件并打开
name:目标文件名,可以包含具体路径
mode:打开文件的模式,包括只读r,写入w,追加a等,可以省略,默认只读
encoding:指定编码,可以省略
测试文件test.txt 写入hello world!
fp = open("test.txt","r",encoding="utf8") # fp是open()函数的文件对象
data = fp.read()
print(data) # hello world!
fp.close()
with open() as fp:
打开文件操作后,会自动关闭文件,不需要使用close()关闭
with open("test.txt") as fp:
data = fp.read()
print(data) # hello world!
with和open()的区别:
with通过enter和exit方法实现了上下文的管理,会自动在enter方法中做初始化工作并且返回一个值,exit方法会在操作结束后会自动清理
mode
- r
默认只读方式打开文件,文件不存在会报错,不支持写入,指针在文件开头
fp = open("test.txtb","r")
# 运行结果:
FileNotFoundError: [Errno 2] No such file or directory: 'test.txtb'
fp = open("test.txt","r")
fp.write("x")
fp.close()
# 运行结果:
io.UnsupportedOperation: not writable
- rb
二进制只读方式打开文件 - r+
打开文件用于读写
测试文件test.txt 写入abcdefg
fp = open("test.txt","r+")
print("原内容:" + fp.read()) # 原内容abcdefg
fp.close()
fp = open("test.txt","r+")
fp.write("php")
fp.seek(0,0)
print("新内容:" + fp.read()) # 新内容phpdefg r+模式指针在开头,会覆盖部分原内容
fp.close()
- rb+
以二进制格式打开文件用于读写 - w
打开文件用于写入,若文件存在,覆盖原来内容,若文件不存在,则创建新文件写入,指针在文件开头 - wb
以二进制格式打开文件用于写入 - w+
打开文件用于读写
测试文件test.txt 写入abcdefg
fp = open("test.txt","w+")
print("原内容:" + fp.read()) # 原内容: w+打开文件会清空原内容
fp.close()
fp = open("test.txt","w+")
fp.write("php")
fp.seek(0,0)
print("新内容:" + fp.read()) # 新内容:php
fp.close()
- wb+
以二进制格式打开文件用于读写, - a
打开文件用于追加,若文件存在,在文件内容后面追加,若文件不存在,则创建新文件写入,指针在文件结尾 - ab
以二进制格式打开文件用于追加 - a+
打开文件用于读写
测试文件test.txt 写入abcdefg
fp = open("test.txt","a+")
print("原内容:" + fp.read()) # 原内容: a+模式指针在最后,所以读不到内容
fp.seek(0,0)
print("原内容:" + fp.read()) # 原内容:abcdefg
fp.close()
fp = open("test.txt","a+")
fp.write("php")
fp.seek(0,0)
print("新内容:" + fp.read()) # 新内容:abcdefgphp a+模式指针在最后,写入内容在最后
fp.close()
- ab+
以二进制格式打开文件用于追加
read()
read(num)
num:表示读取的字节数,不写表示读取所有
fp = open("test.txt")
data = fp.read(5)
print(data) # hello 只读5个字符
fp.close()
readline()
读取一行内容,一般用来读取超大文件
测试文件test.txt 写入hello\nworld\nbye # \n代表换行
fp = open("test.txt")
data = fp.readline() # hello 只读了第一行内容
print(data)
fp.close()
readline()也可以加参数
表示读取一行的几个字符,下次会继续在当前行读取几个字符,一行读完后会继续读下一行
fp = open("test.txt")
print(fp.readline(3)) # hel 读取第一行的3个字符
print(fp.readline(3)) # lo 读取后面3个字符
print(fp.readline(3)) # wor 读取后面3个字符
print(fp.readline(3)) # ld 读取后面3个字符
fp.close()
readlines()
以行的形式一次性读取内容,返回一个列表,每一行为列表的一个元素,注意行末尾包含换行符
fp = open("test.txt")
data = fp.readlines()
print(data) # ['hello\n', 'world\n', 'bye'] 返回所有行内容的列表
fp.close()
write()
write(“content”)
w 和 a 模式:如果文件不存在则创建该文件,文件存在 w模式先清空,再写入,a模式直接末尾追加
注意:写入时默认没有回车符号,需要需要加\n
fp = open("test","w")
fp.write("python")
fp.close() # test.txt文件内容被清空后,正常写入python
fp = open("test","a")
fp.write("\njava")
fp.close() # test.txt文件内容后追加写入\njava
# 运行结果
"""
python
java
"""
writelines()
以列表的形式一次性写入多行
fp = open("test.txt","w")
fp.writelines(["1\n","2\n","3"])
fp.close()
# 运行结果
"""
1
2
3
"""
close()
关闭文件
fp = open("test.txt")
fp.close() # 关闭文件
文件不关闭,操作系统资源有限,资源占用满了之后,系统会死机
指针
seek(offset,whence)
offset:偏移量,正数为从前向后,负数为从后向前
whence:开始位置,可选0文件开头,1当前位置,2文件结尾
默认0文件开头,注意1和2只能在rb模式中使用
fp = open("test.txt")
data = fp.read()
print(data) # python\njava
print(fp.tell()) # 11 注意换行符占一个字节
fp.seek(0,0) # 将指针移动到文件开头位置
print(fp.tell()) # 0
fp.seek(0,2) # 将指针移动到文件结尾位置
print(fp.tell()) # 11
fp.close()
tell()
返回指针的位置
fp = open("test.txt",'r')
print(fp.tell()) # 0 r模式指针在文件开头
fp.close()
fp = open("test.txt",'a')
print(fp.tell()) # 11 a模式指针在文件末尾
fp.close()
fp = open("test.txt",'w')
print(fp.tell()) # 0 w模式指针在文件开头,且会清空原来内容
fp.close()
属性
file.closed
文件关闭返回True,否则返回False
file.mode
返回被打开文件的模式
file.name
返回文件的名称
fp = open("test.txt")
print(fp.closed) # False
print(fp.mode) # r
print(fp.name) # test.txt
fp.close()
print(fp.closed) # True
其他方法
flush()
将缓冲区的内容写入磁盘
fp = open("test.txt","w")
fp.write("python")
fp1 = open("test.txt")
print(fp1.read()) # 未flush()时,数据没有被写入磁盘,读不到数据
fp1.close()
fp.flush() # 将缓冲区内容写入磁盘
fp1 = open("test.txt")
print(fp1.read()) # python flush()后,读取到数据
fp1.close()
fp.close()
fileno()
返回一个长整型文件标签
fp = open("test.txt")
print(fp.fileno()) # 3
fp.close()
isatty()
判断是否是一个Unix系统中的终端设备文件
fp = open("test.txt")
print(fp.isatty()) # False
fp.close()
truncate()
把文件内容裁成指定字节数
fp = open("test.txt","r+")
fp.truncate(10)
fp.seek(0,0)
print(fp.read()) # python\nphp 共10个字节
fp.close()
练习
将一个文件中"alex"字符全部替换成"superman"
test.txt文件写入alexpython\nphpalex\njaalexva\nc #\n代表换行
result = []
fp = open("test.txt","r")
for line in fp.readlines():
if "alex" in line:
result.append(line.replace("alex","superman"))
else:
result.append(line)
fp.close()
fp = open("test.txt","w")
for line in result:
fp.write(line)
fp.close()
# 运行结果
"""
supermanpython
phpsuperman
jasupermanva
c
"""
使用readline()读文件中的全部行
fp = open("test.txt")
while True:
content = fp.readline()
print(content,end="")
if content == "":
break
fp.close()
# 运行结果
"""
supermanpython
phpsuperman
jasupermanva
c
"""
统计文件中包含"superman"的行数
count = 0
fp = open("test.txt")
for line in fp.readlines():
if "superman" in line:
count += 1
print(f"文件中包含{count}个superman") # 文件中包含3个superman
fp.close()
生成10个文件1.txt-10.txt
for i in range(1,11):
fp = open(str(i) + ".txt","w")
fp.close()
# 运行结果:文件正常生成
写入一个文件,写入"superman1"-“superman100”,并读取
fp = open("test.txt","w+")
for i in range(1,101):
fp.write("superman" + str(i) + "\n")
fp.seek(0,0)
for line in fp.readlines():
print(line.strip())
fp.close()
# 运行结果:文件正常生成和读取
文件写入a26-z1,换行隔开
fp = open("test.txt","w")
for i in range(26):
fp.write(chr(ord("a")+i) + str(26-i) + "\n")
fp.close()
# 运行结果:文件正常写入
读2行的文件,在2行中间添加1行
test.txt 文件 python\njava \n代表换行
fp = open("test.txt","r+")
data = fp.readlines()
data.insert(1,"php\n")
fp.seek(0,0)
for i in data:
fp.write(i)
fp.close()
# 运行结果
"""
python
php
java
"""
读第二行内容
# 方法一
fp = open("test.txt")
print(fp.readlines()[1].strip()) # php
fp.close()
# 方法二
fp = open("test.txt")
count = 0
for i in fp:
count += 1
if count == 2:
print(i.strip()) # php
fp.close()
把有空行的文件变成没有空行的文件
test.txt写入python\n\njava \n代表换行
fp = open("test.txt","r+")
data = fp.readlines()
fp.seek(0,0)
for line in data:
if line.strip() == "":
continue
fp.write(line)
fp.close()
# 运行结果
"""
python
java
"""
文件备份:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(如test.txt 备份后 test[备份].txt)
file_name = input("请输入要备份的文件名:")
fp = open(file_name)
data = fp.readlines()
fp.close()
index = file_name.rfind(".")
new_name = file_name[:index] + "[备份]" + file_name[index:]
fp = open(new_name,"w")
for line in data:
fp.write(line)
fp.close() # 文件备份成功