目录
一、文件操作概述:
文件操作:就是将数据从内存中进行持久化,读取本地磁盘或者远程服务器数据加载到内存中,可以使得程序在下一次执行时,可以直接使用上一次执行结束时的数据,而不必重新获取数据!
二、文件基本操作:
文件操作步骤:
1.打开文件:
使用open
函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:
open(name,mode)
- name:指定打开的目标文件名称的字符串(可以包含文件所在的具体路径)
- mode:设置打开文件的模式(只读,写入,追加等)
2.对文件进行读写操作:
# 指定文件对象,通过文件对象,对文件进行读写操作
f.write("hello krian !")
3.关闭文件的输入输出流:
# 关闭文件流
f.close()
demo:
f = open('test.text','w')
#--------------------------------------------------
# 1.打开一个文件(新创建一个文件) open()
f = open('test.text', 'w') # f:作为open函数的文件对象
# 2.指定文件对象,对文件进行读写操作
f.write("hello krian !")
# 3.关闭文件流
f.close()
注意:此时f
是open
函数的文件对象!
文件访问模式:
模式 | 描述 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
基础访问模式特点:
- 访问模式对文件的影响
- 访问模式对
write()
的影响
- 访问模式是否省略
r访问模式:
- 如果文件对象不存在,则会报错
- 不支持写入操作,表示只读
w访问模式:
- 如果文件对象不存在,不会报错,程序自动创建对应的文件对象
- 执行写入操作,如果文件对象已经存在,默认覆盖该文件对象
a访问模式:
- 如果文件对象不存在,不会报错,程序自动创建对应的文件对象
- 执行追加操作,如果文件对象已经存在,默认在文件末尾追加写入的内容
访问模式的参数是否可以省略:
- 针对已经存在的文件对象进行操作时,访问模式可以省略,默认时r访问模式
- 针对不存在的文件对象进行操作时,访问模式不可省略
读取操作:
1.read()
文件对象.read(num)
num:表示要从文件中读取的数据长度(单位字节),如果没有传入num那么就表示读取文件中所有的数据。
注意:每一行结尾处的"\n"的换行符对字节数的占用!!!
2.readline()
readline()
一次性读取一行内容:
f = open('test.txt')
content = f.readline()
print(f'第一行:{content}')
content = f.readline()
print(f'第二行:{content}')
# 关闭文件
f.close()
3.readlines()
readlines()
函数可以按照行的方式把整个文件中内容进行一次性读取,并返回的是一个列表,其中每一行的数据作为一个元素。
test.text文件内容:
hello krian !
hello world !
hello lunaticer!
hello 明天!
# 1.打开一个文件(新创建一个文件) open()
f = open('test.text', 'r') # f:作为open函数的文件对象
# 2.指定文件对象,对文件进行读取操作
test_text = f.readlines()
print(test_text) # ['hello krian !\n', 'hello world !\n', 'hello lunaticer!\n', 'hello 明天!']
# 3.关闭文件流
f.close()
文件对象方法:
seek()
作用:用来移动文件指针。
文件对象.seek(偏移量,起始位置)
- 0:文件开头
- 1:当前位置
- 2:文件结尾
三、文件备份:
- 需求分析
- 根据需求分析步骤
- 根据实际场景体调优
实现步骤:
- 接收用户输入的文件名
- 规划备份文件名
- 备份文件写入数据(数据与原文件一致)
代码实现:
1.接收用户输入的目标文件名:
old_name = input('请输入您要备份的文件名:')
2.规划备份文件名:
rfind()
函数:从字符串右侧开始查找,返回下标索引值lfind()
函数:从字符串左侧开始查找,返回下标索引值
# 提取文件后缀点的下标
index = old_name.rfind('.')
字符串变量名[起始索引:终止索引]
:字符串切片,返回子串
old_name[:index]
# 组织新文件名 旧文件名 + [备份] + 后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]
# 打印新文件名(带后缀)
# print(new_name)
3.备份文件写入数据:
# 打开文件
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')
# 将源文件数据写入备份文件
while True:
con = old_f.read(1024)
if len(con) == 0:
break
new_f.write(con)
# 关闭文件
old_f.close()
new_f.close()
4.代码优化:
添加判断条件,限制后缀:
old_name = input('请输入您要备份的文件名:')
index = old_name.rfind('.')
if index > 0:
postfix = old_name[index:]
new_name = old_name[:index] + '[备份]' + postfix
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')
while True:
con = old_f.read(1024)
if len(con) == 0:
break
new_f.write(con)
old_f.close()
new_f.close()