zoukankan      html  css  js  c++  java
  • 文件处理高级

    复制文件:从源文件读取 写入到新文件中
    #打开源文件
    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(" ")
    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 += " "
    # 拼接修改过的数据
    new_data += new_line
    else:
    # 拼接未被修改的数据
    line += " "
    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(' , ')#将交换文件重命名为原文件名
  • 相关阅读:
    第一次个人编程作业
    第一次博客作业
    20175311 2018-2019-2 《Java程序设计》第五周学习总结
    2018-2019-2 20175311 实验一《Java开发环境的熟悉》实验报告
    20175311 2018-2019-2 《Java程序设计》第四周学习总结
    团队项目-选题报告
    第二次结队编程作业
    第一次结对编程作业
    第1组 团队展示(组长)
    第一次个人编程作业
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10239172.html
Copyright © 2011-2022 走看看