文件处理高级

复制文件:从源文件读取 写入到新文件中
#打开源文件
source_f=open('作业.py','rb')
#打开目标文件
dst_f=open('作业副本.py','wb')
#从原文件读取数据写入到目标文件
data=source_f.read()
dst_f.write(data)
source_f.close()
dst_f.close()

#并列打开多个文件 可以用逗号分开
with open ('作业.py','rb') as source_f,open("作业副本.py","wb") as dst_f:
data=source_f.read()
dst_f.write(data)

#with的嵌套语法
with open("作业基础版.py","rb") as source_f:
with open("作业副本.py","wb") as dst_f:
data = source_f.read()
dst_f.write(data)

#with的嵌套时 注意:不要对同一个文件进行操作
with open ('log.txt','rb') as source_f:
with open('log.txt','wb') as source_f:
data=source_f.read()
dst_f.write(data)

让用户指定要复制的文件
source_path = input("请输入源文件路径:").strip()
dst_path = input("请输入目标文件路径:").strip()

with open(source_path,"rb") as source_f:
with open(dst_path,"wb") as dst_f:
data = source_f.read()
dst_f.write(data)

基于CMD的复制工具 要达到的效果是在CMD中直接输入复制的文件路径 一回车就完成效果

1.需要获取CMD输入的参数
import sys#有一个文件叫sys import是导入这个文件
sys文件里有一个变量名称叫argv

print(sys.argv)#得到的就是执行解释器时传入的参数,第一个参数默认就是当前执行文件
#源文件路径
source_path=sys.argv[1]
#目标文件路径
dst_path=sys.argv[2]
with open (source_path,'rb') as source_f:
with open(dst_path,'wb') as dst_f:
data=source_f.read()
dst_f.write(data)

文件对象其他操作
f.name #获取文件的路径
f.flush #刷出 开机将数据写入硬盘 可以保证数据不丢失 但效率会降低

操作系统会在文件关闭时一次性写入
当操作系统的缓存满了也会写入
是为了减少I/O操作 提高效率

f = open("userdb.txt","at",encoding="utf-8")
for i in range(10):
data = input(">>:").strip()
f.write(data)
print("写了一次")
f.flush() # 立即将数据写入硬盘,可以保证数据不丢失,但是效率会降低
f.close()
print(f.closed)#文件是否已经关闭
print(f.encoding)#获取文件的编码方式
print(b.buffer)#获取缓冲区 忘记它吧


文件的修改:
1.读取文件数据到内存
2.进行修改
3.将修改后的数据写会文件中
new_data = ""
with open("userdb.txt",encoding="utf-8") as f:
data = f.read()
datas = data.split("\n")
for line in datas:
print(line.split("|")[0])
name = line.split("|")[0]
if name == "admin": # 取出名字判断是否等于admin
name = name+"[is good man]" # 如果是则添加 is good man
# 取出密码 和手机号 再次拼接为原来的样式
pwd = line.split("|")[1]
phone = line.split("|")[2]
new_line = "|".join([name,pwd,phone])
new_line += "\n"
# 拼接修改过的数据
new_data += new_line
else:
# 拼接未被修改的数据
line += "\n"
new_data += line

print(new_data)
with open("userdb.txt",mode="wt",encoding="utf-8") as f:
f.write(new_data)

以上代码存在什么问题相当于把整个文件数据都存到内存中 会造成内存溢出


文件修改的第二种方法:
读一行 修改一行 修改完立马写入硬盘,避免内存溢出问题

具体使用哪种方式 得看文件大小
较小的文件 推荐一次性读到内存进行修改 减少io操作
较大的文件 则必须采用第二种
with open("userdb.txt",mode="rt",encoding="utf-8") as source_f,open("temp.swap",mode="wt",encoding="utf-8") as dst_f:
for line in source_f:
new_line = line.replace("admin","ADMIN")
dst_f.write(new_line)

import os
os.remove("userdb.txt") # 删除源文件
os.rename("temp.swap","userdb.txt") # 将交换文件重命名为源文件名


import os
os.remove('')#删除文件
os.rename(' , ')#将交换文件重命名为原文件名
posted @ 2019-01-08 15:19  777ijBGly-  阅读(144)  评论(0编辑  收藏  举报