文件操作的基本步骤
1.打开文件
2.读写等操作
3.关闭文件
打开文件用到的函数:open()
1.功能:使⽤open函数,可以打开⼀个已经存在的⽂件,或者创建⼀个新文件。
2.语法:
文件对象.open(name,mode,[encoding])
name:是要打开的⽬标⽂件名的字符串(可以包含⽂件所在的具体路径)。
mode:设置打开⽂件的模式(访问模式):只读、写⼊、追加等。
encoding:对文本文件的编码和解码方式,只适用于文本文件(txt/csv等),如GBK,CP936等。
只读:即'r',以只读⽅式打开⽂件。⽂件的指针将会放在⽂件的开头。这是默认模式。
写⼊:即'w',打开⼀个⽂件只⽤于写⼊。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂件。
追加:即'a',打开⼀个⽂件⽤于追加。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。也就是说,新的内容将会被写⼊到已有内容之后。如果该⽂件不存在,创建新⽂件进⾏写⼊。
3.示例:
f = open('test.txt','w')
f.write('aaa')
f.close()
#结果:自动创建了一个名为‘test’格式为txt的文件,打开里面信息为aaa
4.注意:
①对于open(name,‘r’):只读,如果文件不存在,则报错;如果文件存在,则进行读操作。光标在开头。
②对于open(name,‘w’):写入,如果文件不存在,则新建一个文件;如果文件存在,则执行写入操作,每次执行写入都会覆盖原来的内容。光标在开头。
③对于open(name,‘a’):追加,如果文件不存在,则新建一个文件;如果文件存在,则在原来内容基础上,追加新内容。光标在结尾
④访问模式mode也可以省略,省略时默认’r’(只读)
打开文件还可以用的函数:with open()
1.语法:
with open(name,mode,[encoding]) as fp:
{文件操作(fp....)}
name:是要打开的⽬标⽂件名的字符串(可以包含⽂件所在的具体路径)。
mode:设置打开⽂件的模式(访问模式):只读、写⼊、追加等。
encoding:对文本文件的编码和解码方式,只适用于文本文件(txt/csv等),如GBK,CP936等。
2.使用原因:
在文件读写过程中,可能导致程序崩溃,即使使用close()也不能正常关闭文件(依旧开着)。而with open()函数中,对文件的操作是写在缩进中的,只要代码退出缩进,就会自动关闭文件,有效处理了文件无法正常关闭的情况。
3.示例:
文件1.txt中的内容:
aaaaa
with open('1.txt','r+') as fp:
content = fp.read()
print(content)
#结果:aaaaa
写文件用到的函数:write()
用这三个函数之前的open()里面的mode必须是’w’
1.语法:
文件对象.write('内容')
2.示例:
with open('test.txt','w') as fp:
fp.write('xxx')
#结果:生成一个名为test的txt文件,文件的内容是:xxx
读文件用到的函数:read(),readlines()readline()
用这三个函数之前的open()里面的mode必须是’r’
1.read()函数:
①语法:
⽂件对象.read(num)
②注意:num表示要从⽂件中读取的数据的⻓度(单位是字节),如果没有传⼊num,那么就表示读取⽂件中所有的数据。
③示例:
text文件中:
aaaaa
bbbbb
ccccc
ddddd
eeeee
无参数:
with open('test.txt','r') as fp:
content = fp.read()
print(content)
#结果:
# aaaaa
# bbbbb
# ccccc
# ddddd
# eeeee
有参数:
with open('test.txt','r') as fp:
content = fp.read(10)
print(content)
#结果:
# aaaaa
# bbbb
文件内容中有看不见的换行符’\n’,会占用一个字节位
2.readlines()函数:
①功能:readlines()可以按照行的方式把整个⽂件中的内容进行⼀次性读取,并且返回的是⼀个列表,其中每⼀行的数据为作为列表的⼀个元素。
②语法:
文件对象.readlines()
③示例:
text文件中:
aaaaa
bbbbb
ccccc
ddddd
eeeee
最后一行e后面没有换行
with open('test.txt','r') as fp:
print(fp.readlines())
#结果:['aaaaa\n', 'bbbbb\n', 'ccccc\n', 'ddddd\n', 'eeeee']
3.readline()函数:
①功能:readline()⼀次读取⼀⾏内容,即用第一次读取第一行的内容,用第二次读取第二行的内容…
②语法:
文件对象.readline()
③示例:
text文件中:
aaaaa
bbbbb
ccccc
ddddd
eeeee
with open('test.txt','r') as fp:
print(fp.readline())#读取test第一行:aaaaa
print(fp.readline())#读取test第二行:bbbbb
print(fp.readline())#读取test第三行:ccccc
#结果:
# aaaaa
#
# bbbbb
#
# ccccc
访问模式的特点
各访问模式(mode)的功能:
特点:
1.带+的:可读可写
2.带b的:以二进制格式打开文件
3.带r的:文件指针在文件内容的开头
4.带w的:文件指针在文件内容的开头
5.带a的:文件指针在文件内容结尾
6.r+:没有该文件则报错;文件的指针在开头,能读取出数据
7.w+:没有文件会新建文件;文件指针在开头,有写操作时,就能读取数据,没有写操作时,新内容会覆盖就内容,无法读取数据
8.a+:没有文件会新建文件;文件指针在结尾,无法读取文件中的数据
改文件光标位置的函数:seek()
①作⽤:⽤来移动⽂件指针。
②语法:
⽂件对象.seek(偏移量, 起始位置)
起始位置:
0:⽂件开头
1:当前位置
2:⽂件结尾
③注意:先执行起始位置移动光标,后根据偏移量再便宜光标。
④示例:
文件test里面的内容:
aaaaa
bbbbb
ccccc
ddddd
eeeee
先读取并显示test文件里的东西:
f = open('test.txt','r+')
con = f.read()
print(con)
f.close()
#结果:
# aaaaa
# bbbbb
# ccccc
# ddddd
# eeeee
重新设置光标初始位置:设置成从开头往右两个
f = open('test.txt','r+')
f.seek(2,0)
con = f.read()
print(con)
f.close()
#结果:
# aaa
# bbbbb
# ccccc
# ddddd
# eeeee
f = open('test.txt','a+')
#mode为a+时,光标在文件内容的结尾
f.seek(0,0)
#将光标调整到文件内容的开头,如果不调整,打印出来的内容为空
con = f.read()
print(con)
f.close()
#结果:
# aaaaa
# bbbbb
# ccccc
# ddddd
# eeeee
文件备份
1.需求:⽤户输⼊当前⽬录下任意⽂件名,程序完成对该⽂件的备份功能(备份⽂件名为xx[备份]后缀,例如:test[备份].txt)。
2.步骤:
①接收⽤户输⼊的⽂件名
②规划备份⽂件名
③备份⽂件写⼊数据
3.代码实现
#1.接收用户输入的文件名
old_name = input('请输入您想要备份的文件名:')
#2.规划备份文件名
#2.1提取目标文件后缀
#2.2组织备份的文件名:xx[备份]后缀
#从右边开始找第一个'.'的下标
index = old_name.rfind('.')
#只有文件有效(.后缀前面必须有东西,即index>0)才进行如下操作
if index>0:
postfix = old_name[index:]
#组织新文件名:旧文件名+[备份]+后缀
new_name = old_name[:index] + '[备份]' + postfix
#3,将备份文件写入数据
#3.1打开源文件和备份文件
#3.2将源文件的数据写入备份文件
#3.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()
运行前需要备份的文件test.txt,它的内容:
aaaaa
bbbbb
ccccc
ddddd
eeeee
运行改程序备份该文件后,出现一个test[备份].txt文件,它的内容:
aaaaa
bbbbb
ccccc
ddddd
eeeee