python之文件处理的选项中描述错误的是,python之文件处理模块
Yyds干货库存
前戏应用程序运行过程中产生的数据首先存储在内存中。如果你想永久保存,你必须把它保存在硬盘里。应用要操作硬件,必须经过操作系统,而文件就是操作系统提供给应用操作硬盘的虚拟概念。用户或应用程序对文件的操作是对操作系统进行调用,然后操作系统在硬盘上完成具体操作。
文件操作的基本过程
有了文件的概念,我们再也不需要考虑操作硬盘的细节,只需要关注操作文件的过程:
# 1.打开文件,应用程序启动系统调用open(.)到操作系统。操作系统打开对应于硬盘空间的文件,并返回要赋给变量f的文件对象。
A=open (a.txt , r ,编码= utf-8) #默认的打开方式是r。
# 2.调用file对象下的读/写方法会被操作系统转换为读写硬盘。
data=a.read()
# 3.向操作系统发起文件关闭请求,以回收系统资源。
a .关闭()
资源恢复和上下文管理打开一个文件包含两个资源:应用程序的变量F和操作系统打开的文件。当一个文件完成时,与该文件相关的两个资源必须完全恢复。恢复方法是:
1.a.close() #回收操作系统打开的文件资源。
2.del a #在应用级回收变量,其中del a必须发生在a.close()之后,否则会导致操作系统打开的文件无法关闭,白白占用资源。而python的自动垃圾收集机制决定了我们不需要考虑del a,这就需要我们在操作完文件后记住a.close()。虽然我们强调了这一点,但是,大多数读者还是会不由自主地忘记a.close()。考虑到这一点,python提供了with关键字来帮助我们管理上下文。
# 1,执行完子代码块后,with会自动执行a.close()
用open(a.txt , w )作为f:
及格
# 2,可以用with同时打开多个文件,并用逗号分隔。
用open(a.txt , r )作为read_f,open(b.txt , w )作为write_f:
data=read_f.read()
Write_f.write(data)指定操作文本文件的字符编码。a=打开(.)是操作系统打开的文件。如果打开一个文本文件,就会涉及到字符编码。如果没有为open指定编码,那么打开文本文件的默认编码显然是由操作系统决定的。操作系统会用自己的默认编码打开文件,在windows下是gbk,在linux下是utf-8。
这使用了上一课提到的字符编码的知识:如果你想确保没有乱码,文件应该以它存储的任何方式打开。
a=打开( a.txt , r ,编码=utf-8 )
的文件操作模式控制文件读写操作的模式r(默认):只读。
女:就写吧。
答:只补充案例一:r模式的使用。
# r只读模式:当文件不存在时,会报错,文件中的指针会直接跳转到文件的开头。
用open(a.txt ,mode=r ,encoding=utf-8 )作为f:
Res=f.read() #将文件的所有内容从硬盘读入内存,并赋给Res。
实现用户认证功能。
用户名=输入(用户名:)。条状()
password=input(password:)。条状()
用open(ruserinfo.txt , r ,encoding=utf8 )作为f:
file_data=f.read() # lele123
real_name,real_pwd=file_data.split( )
如果用户名==真实姓名,密码==真实密码:
打印(“登录成功”)
破裂
否则:
打印(“错误的用户名或密码”)案例2:W模式的使用
# w只写模式:当文件不存在时,会创建一个空文档;当文件存在时,文件将被清空,文件指针将运行到文件的开头。
用open(b.txt ,mode=w ,encoding=utf-8 )作为f:
F.write (Hello \n )
F.write (Hello \n )
F.write(大家好\n )
f.write(111\n222\n333\n )
#强调:
# 1如果文件没有关闭,就连续写,写完的内容一定要跟着写之前的内容。
# 2如果在W模式下重新打开文件,文件内容将被清空。案例3:模式的使用
# a只追加写模式:文件不存在时会创建一个空文档,文件存在时文件指针会直接移动到文件末尾。
用open(c.txt ,mode=a ,encoding=utf-8 )作为f:
f.write(44444\n )
f.write(55555\n )
#强调W模式和A模式的异同:
# 1相似性:如果打开的文件没有关闭,连续写入后新内容会一直跟随前一个。
# 2区别:在模式A下重新打开文件,不会清空原文件,而是将文件指针直接移动到文件的末尾,新写入的内容总是写在末尾。
#练习:实现注册功能:
name=input(用户名:)。条状()
pwd=input(密码:)。条状()
用open(db1.txt ,mode=a ,encoding=utf-8 )作为f:
信息=%s:%s\n %(名称,密码)
案例4:模式的使用(理解)
# r w a:可读和可写
#在正常工作中,我们只使用r/w/a,只读或只写。一般情况下,我们不使用可读写模式来控制文件内容的读写模式。注意:tb模式不能单独使用,必须和R/W/A其中之一结合使用。
t(默认):文本模式
1.读写文件是基于字符串的。
2.仅适用于文本文件。
3.必须指定编码参数。
二进制模式:
1.读写文件以字节/二进制为单位。
2.所有文件都可以作为目标。
3.不得指定编码参数。案例1:T模式的使用
# t mode:如果我们指定的文件打开模式是r/w/a,默认为rt/wt/at。
用open(a.txt ,mode=rt ,encoding=utf-8 )作为f:
res=f.read()
Print(type(res)) #输出结果是:class str
用open(a.txt ,mode=wt ,encoding=utf-8 )作为f:
s=abc
f . write #也必须是字符串类型。
# Emphasis: T-mode只能用来操作文本文件。无论读写,都应该是以字符串为单位,而访问硬盘是以二进制的形式。指定T模式时,内部编解码情况2:B模式的使用为我们完成。
# b:读和写都以二进制位为单位。
用open(1.mp4 ,mode=rb )作为f:
data=f.read()
Print(type(data)) #输出结果是:class bytes
用open(a.txt ,mode=wb )作为f:
Msg=你好
Res=msg.encode(utf-8) # res的类型是bytes
F.write(res) #在B模式下只有bytes类型可以写入文件。
#重点:B模式和t模式比较。
1.在对纯文本文件的操作中,T模式帮助我们节省编解码,而B模式需要手动编解码,所以此时T模式更方便。
2.非文本文件(如图片、视频、音频等)只能使用B模式。)
#案例:编写复制工具
Src_file=input(源文件路径:)。条状()
Dst_file=input(目标文件路径:)。条状()
with open(r%s %src_file,mode=rb )作为read_f,open(r%s %dst_file,mode=wb )作为write_f:
对于read_f中的行:
#打印(行)
Write_f.write(line)操作文件的方法# read操作
F.read() #读取所有内容,这个操作之后,文件指针会移动到文件的末尾。
F.readline() #读取一行内容,光标移动到第二行的头。
F.readlines() #读取每一行并存储在列表中。
#强调:
# f.read()和f.readlines()都是一次性将内容读入内容。如果内容太大,就会导致内存溢出。如果还想把所有内容都读入内存,就必须分几次读。有两种方法可以实现它:
#模式1
用open(a.txt ,mode=rt ,encoding=utf-8 )作为f:
对于f中的行:
Print(line) #一次只有一行内容被读入内存
#模式2
用open(1.mp4 ,mode=rb )作为f:
虽然正确:
Data=f.read(1024) #同时只有1024个字节被读入内存
如果len(data)==0:
破裂
打印(数据)
#写操作
F.write(1111\n222\n) #对于在文本模式下编写,您需要编写自己的换行符。
F.写( 1111 \ N222 \ n 。encode( UTF-8 )#对于B模式编写,需要自己写换行符。
F.writelines ([333 \ n , 444 \ n]) #文件模式
F.writelines([字节( 333 \ n ,编码= UTF-8 ), 444 \ n 。encode (UTF-8)]) # b模式,以了解f.readable() #文件是否可读。
F.f.writable() #文件可读吗?
F.f.closed #文件关闭了吗?
F.encoding #如果文件打开方式是B,则没有这个属性。
F.flush() #立即将文件的内容从内存刷到硬盘
F.name主动控制文件中的指针移动#前提:文件中的指针移动以字节为单位,唯一的例外是T模式下的read(n),n,其中n以字符为单位。
用open(a.txt ,mode=rt ,encoding=utf-8 )作为f:
Data=f.read(3) #读取3个字符
用open(a.txt ,mode=rb )作为f:
Data=f.read(3) #在读取3个字节#之前,指针在文件中的移动是由读/写操作被动触发的。如果要读取文件中特定位置的数据,需要使用f.seek方法主动控制指针在文件中的移动。具体用法如下:
# f.seek(指针移动的字节数,模式控制):
#模式控制:
# 0:默认模式,这意味着指针移动的字节数指的是文件的开头。
# 1:此模式表示指针移动的字节数基于当前位置。
# 2:此模式意味着指针移动的字节数基于文件末尾的位置。
# Emphasis: 0模式可用于T或B模式,而1和2模式只能在B模式下用case: 0模式详细说明。
# a.txt采用utf-8编码,内容如下(abc各1字节,中文“Hello”各3字节)
你好abc
# 0模式的使用
用open(a.txt ,mode=rt ,encoding=utf-8 )作为f:
F.seek(3,0) #引用文件的开头移动了3个字节。
Print(f.tell()) #从文件开头开始检查当前文件指针的位置,输出结果为3。
Print(f.read()) #从第三个字节读取到文件末尾,输出结果为:Hello
#注意:T模式下,读取的内容会自动解码,所以必须保证读取的内容是完整的中文数据,否则解码会失败。
用open(a.txt ,mode=rb )作为f:
f.seek(6,0)
Print (f.read()。decode( UTF-8 )#输出结果是:OK
案例:1模式解释
使用# 1模式
用open(a.txt ,mode=rb )作为f:
F.seek(3,1) #从当前位置向后移动3个字节,此时的当前位置是文件的开头。
Print(f.tell()) #输出结果是:3
F.seek(4,1) #从当前位置向后移动4个字节,而此时的当前位置是3
Print(f.tell()) #输出结果为:7例:0模式详解
# a.txt采用utf-8编码,内容如下(abc各1字节,中文“Hello”各3字节)
你好abc
# 2模式的使用
用open(a.txt ,mode=rb )作为f:
F.seek(0,2) #通过引用文件末尾移动0字节,即直接跳转到文件末尾。
Print(f.tell()) #输出结果是:9
F.seek(-3,2) #引用文件的末尾向前移动了3个字节。
Print (f.read()。decode( UTF-8 )#输出结果是:OK
#小练习:实现动态查看最新日志的效果(类似于tail -f)
导入时间
用open(access.log ,mode=rb )作为f:
f.seek(0,2)
虽然正确:
line=f.readline()
如果len(line)==0:
#无内容
时间.睡眠(0.5)
否则:
print(line.decode(utf-8 ),end= )
文件#的修改文件a.txt的内容如下
张译丹山东179 49 12344234523
河北二丹163 57 13913453521
王全丹山西153 62 18651433422
#执行操作
用open(a.txt ,mode=r t ,encoding=utf-8 )作为f:
f .寻找(9)
F.write(“女性导演”)
#文件的修改内容如下
张一蛋女导演179 49 12344234523
河北二丹163 57 13913453521
王全丹山西153 62 18651433422
#强调:
# 1,硬盘空间无法修改,硬盘中的数据通过用新内容覆盖旧内容来更新。
# 2.内存中的数据可以修改。该文件对应于硬盘空间。硬盘不可修改的事实对应了文件的性质,所以我们可以看到文件的内容是可以修改的。是如何实现的?总的思路是将硬盘中的文件内容读入内存,修改后在内存中覆盖。具体实现方式分为两种:
方法1:
#实现思路:将文件的所有内容一次性读入内存,然后在内存中修改后覆盖写回原文件。
#优点:在文件修改过程中,相同的数据只有一个副本。
#缺点:会占用太多内存。
用open(db.txt ,mode=rt ,encoding=utf-8 )作为f:
data=f.read()
用open(db.txt ,mode=wt ,encoding=utf-8 )作为f:
F.写(数据。替换( lele , sb ))模式2:
#实现思路:读取打开原文件,写入打开临时文件,逐行读取原文件内容,修改后写入临时文件,删除原文件,将临时文件重命名为原文件名。
#优点:不会占用太多内存
#缺点:在文档修改过程中保存了相同数据的两份副本。
导入操作系统
用open(db.txt ,mode=rt ,encoding=utf-8 )作为read_f,\
打开( . db.txt.swap ,mode=wt ,encoding=utf-8 )作为wrife_f:
对于read_f中的行:
wrife_f.write(line.replace(SB , kevin ))
os.remove(db.txt )
os.rename(.db.txt.swap , db.txt )
转载请联系作者获得授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。