作用

把数据存储起来,程序执行时可以直接使用,省时省力

基本操作

步骤

  • 打开 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() # 文件备份成功