python文件操作中合法的文件打开模式_文件的高级处理(文件打开模式,控制文件操作方法,控制文件指针移动,文件修改的两种方式)...

一、文件的打开模式分类两大类

1、控制文件读写操作的模式

1.1 r:只读(不指定模式下默认的模式):在文件不存在时则报错,文件存在时文件指针跳到文件开头

f=open('m.txt',mode='rt',encoding='utf-8')

# res = f.read()

print(f.readable())#True

print(f.writable())#False

f.close()

1.2 w:只写:在文件不存在时则创建空文件,文件存在时则清空,文件指针跳到文件开头

f=open('b.txt',mode='wt',encoding='utf-8')

f.write("你好啊哈哈哈\n")

f.write("hello1\n")

f.write("hello2\n")

f.close()

1.3 a:只追加写:在文件不存在时则创建空文件,文件存在时也不会清空,文件指针跳到文件末尾

f=open('c.txt',mode='at',encoding='utf-8')

f.write("jason:777\n")#会换行

f.write("jjj:666\n")

f.close()

总结:w与a的异同

相同点:在打开了文件不关闭的情况下,连续地写入,新的内容永远跟在老内容之后

不同点:重新打开文件,w会清空老的内容,而a模式会保留老的内容并且指针跳到文件末尾

示范1:注册功能

# 示范1:注册功能

name = input("your name: ").strip()

# 做合法性校验:

# 1、如果输入的用户名包含特殊字符^$&...让用户重新输入

# 2、如果输入的用户名已经存在也重新输入

pwd = input("your password: ").strip()

# 做合法性校验:

# 1、密码长度

# 2、如果密码包含特殊字符则重新输入

f = open('user.txt',mode='at',encoding='utf-8')

f.write('%s:%s\n' %(name,pwd))

f.close()

示范2:登录功能

# 示范2:登录功能

inp_name = input("your name: ").strip()

inp_pwd = input("your pwd: ").strip()

f = open('user.txt',mode='rt',encoding='utf-8')

for line in f:

user,pwd=line.strip('\n').split(':')#解压赋值

if inp_name == user and inp_pwd == pwd:

print('login successful')

break

else:

print('user or password error')

f.close()

# 升级需求1:同一个账号输错三次则退出

# 升级需求2:同一个账号输错三次则,该账号则锁定10秒,即便程序被终止,仍然计时

2、控制文件读写内容的模式

1.1 t(在不指定的情况下默认的模式):读写都是以str字符串为单位,一定要指定encoding--------只能处理文本文件

f=open('a.txt',mode='rt',encoding='utf-8')

f.read()

f.close()

1.2 b:读写都是以bytes为单位,一定不能指定encoding参数----------可以处理任意文件

#r

f=open('m.txt',mode='rb')

data=f.read()

print(data,type(data))#b'hello\r\n\xe4\xbd\xa0\xe5\xa5\xbd\r\n123\r\n\r\n'

print(data.decode('utf-8'))#b模式要解码

f.close()

#w

f=open('m.txt',mode='wb')

f.write("egon".encode('utf-8'))

f.close()

3、 上下文管理with

with open(...) as f,open(...) as f1:

f.read()

4、案例:编写文件拷贝程序

src_file=input("源文件路径:").strip()

dst_file=input("目标文件路径:").strip()

with open(r'%s' %src_file,mode='rb') as src_fobj,open(r'%s' %dst_file,mode='wb') as dst_fobj:

# data=src_fobj.read()

for line in src_fobj: # line=第二行内容

dst_fobj.write(line)

5、补充模式

rwa

tb必须和rwa联用

+必须与rwa联用:r+、w+、a+ (r+、w+、a+ 它们都可读可写)

有:

r+t

w+t

a+t

r+b

w+b

a+b

不指定模式,那么默认的是rt

with open('a.txt') as f:#默认rt模式

pass

with open('a.txt',mode='w+') as f:#默认wt模式

pass

二、控制文件操作的其他方法

1、读相关方法

readline() :读一行,读完一行之后,光标会转到下一行行首,\n占用2个字符

readlines():相当于内置了for循环,一行一行读出来,把所有内容读出并且返回列表

with open('a.txt',mode='rt',encoding='utf-8') as f:

line1=f.readline()

line2=f.readline()

line3=f.readline()

print(line1)

print(line2)

print(line3)

lines=[]

for line in f:

lines.append(line)

lines=f.readlines()#for循环简写为此行

print(lines)

2、写相关方法

f.write()#一次性写入

f.writelines()#有个可以被for循环的,把所有写出(写出来跟f.write一样,但底层原理不一样

with open('b.txt',mode='wt',encoding='utf-8') as f:

lines=['111\n','222\n','333\n']

for line in lines:

f.write(line)

# f.writelines(lines)#for循环简写成此行

f.writelines("hello")

3、其他

f.flush()#实时把数据刷新到硬盘,一般不要用,涉及到安全性

f.name #取的是打开文件的路径

with open(r'a.txt',mode='wt',encoding='utf-8') as f:

print(f.name) # 取的是打开文件的路径 a.txt

print(f.closed)#False

for i in range(100):

f.write("%s\n" %i)

f.flush()#实时刷新

三、控制文件指针的移动

1、控制文件内指针的移动都是以字节为单位

只有一种特殊情况,t模式下的read(n),代表的是n个字符,此外代表的全都是字节

with open('f.txt',mode='rt',encoding='utf-8') as f:

data=f.read(6) # 6个字符

print(data)

with open('f.txt',mode='rb') as f:

# data=f.read(6) # 6个字节

data=f.read(8) # 8个字节

print(data.decode('utf-8'))

2、f.seek(n,模式) # n代表的移动的字节个数

模式:

0模式:参照文件的开头开始移动(只有0模式可以在t下使用,1和2模式只能在b下使用)

ps: f.tell():告诉光标现在所在的位置

with open('f.txt',mode='rt',encoding='utf-8') as f:

f.seek(5,0)

print(f.tell())

print(f.read())

print(f.tell())

print('='*100)

f.seek(0,0)

print(f.read())

1模式:参照指针当前所在的位置

with open('f.txt',mode='rb') as f:

f.seek(3,1)

f.seek(3,1)

print(f.tell())

# f.seek(2,1)

f.seek(5,0)

print(f.read().decode('utf-8'))

2模式:参照文件末尾的位置

with open('f.txt',mode='rb') as f:

f.seek(0,2)

f.seek(-3,2)

# print(f.tell())

print(f.read().decode('utf-8'))

ps: a+  f.seek()   指针可以跳到文件末尾

3、案例:模拟程序记录日志的功能

import time

for i in range(10000):

with open('access.log',mode='at',encoding='utf-8') as f:

t=time.strftime("%Y-%m-%d %H:%M:%S")

content="egon给刘老师转了%s个亿" %i

msg=f"{t} {content}\n"

f.write(msg)

time.sleep(3)

#time模块介绍

import time

time.strftime("%Y-%m-%d %H:%M:%S")

time.sleep(n) #n代表几秒

4、读取日志程序

#读取日志程序

import time

with open('access.log', mode='rb') as f:

f.seek(0, 2)

while True:

line = f.readline()

if len(line) == 0:

# 没有读到内容

time.sleep(0.5)

else:

print(line.decode('utf-8'), end='')

5、了解truncate()

f.truncate(n)从文件开头往后数n个字节保留下来,其余全部删除

f.truncate()从文件开头往后数指针当前所在的位置,其余全部删除

with open('f.txt',mode='ab') as f:

# f.truncate(3)

# f.seek(-3,2)

f.truncate()

6、功能小结

#掌握

f.read() #读取所有内容,光标移动到文件末尾

f.readline() #读取一行内容,光标移动到第二行首部

f.readlines() #读取每一行内容,存放于列表中

f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符

f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符

f.writelines(['333\n','444\n']) #t模式

f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

#了解

f.readable() #文件是否可读

f.writable() #文件是否可读

f.closed #文件是否关闭

f.encoding #如果文件打开模式为b,则没有该属性

f.flush() #立刻将文件内容从内存刷到硬盘

f.name #获取打开的文件路径

del f #回收应用程序级的变量

四、文件修改的两种方式

文件对应的是硬盘空间,硬盘都是用新内容覆盖旧内容,没有修改的概念,但是内存是可以修改的

如何修改文件:

思路:把硬盘的内容先读入内存,然后在内存中修改完毕后,再覆盖会硬盘

------------------------------------------------------------------

方式一:

步骤:

1、先将硬盘中文件的内容全部读入内存,然后在内存中修改完毕得到一个修改好的结果

2、将修改的结果覆盖回原文件

优点: 不耗费硬盘

缺点:耗费内存

应用:wps,文本编辑器

with open('a.txt',mode='rt',encoding='utf-8') as f1:

data=f1.read()

res=data.replace('lxx','SB')

with open('a.txt',mode='wt',encoding='utf-8') as f2:

f2.write(res)

方式二:

步骤:

1、循环读取源文件内容,一行行修改一行行写入一个新的临时文件

2、删除源文件

3、将临时文件重命名为源文件名

优点:节省内存

缺点:耗费硬盘空间

应用:针对大文件用

importos

with open('a.txt',mode='rt',encoding='utf-8') as f1,\

open('.a.txt.swp',mode='wt',encoding='utf-8') as f2:for line inf1:

res=line.replace('SB','lxx')

f2.write(res)

os.remove('a.txt')

os.rename('.a.txt.swp','a.txt')

原文链接:https://www.cnblogs.com/guojieying/p/13323604.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值