zoukankan      html  css  js  c++  java
  • Python学习心得第三周-04 文件管理--指针移动和修改文件

    文件内指针操作(掌握):
    f.seek:
    第一个参数:控制移动的字节数
    第二个参数:控制移动的参照物,值可以为0、1、2

    0:参照文件开头(在b和t模式都能用)
    强调:除了0模式以外模式都只能在b模式下使用,即1和2模式只能用在b模式下
    with open('e.txt',mode='rt',encoding='utf-8') as f:
        # f.seek(6,0) # 单位是字节
        # print(f.read())
        f.read()
        f.seek(0,0)
        print('第二次',f.read())

    1: 参照当前位置(只能在b模式下用)
    储备:read(n)
    read的n在t模式下代表的是字符个数
    read的n在b模式下代表的是字节个数
    其余所有文件内指针的移动都是以字节为单位
    with open('e.txt',mode='rt',encoding='utf-8') as f:
        data=f.read(2)
        print(data)
    
    with open('e.txt',mode='rb') as f:
        data=f.read(3)
        print(data.decode('utf-8'))
    
    with open('e.txt',mode='rb') as f:
        s=f.read(3) # 指针在第3个bytes
        # print(s)
        # print(f.tell())
        # f.seek(6,0)
        f.seek(3,1)
        print(f.read())

    2:参照文件末尾(只能在b模式下用)
    with open('e.txt',mode='rb') as f:
        f.seek(-6,2)
        print(f.read())
    
    
    with open('e.txt','r+t',encoding='utf-8') as f:
        f.truncate(9) # 从文件开头截取到3bytes的位置,其余的删除
    

      

    修改文件

    文本编辑器修改文件的原理:
    1、先将文件内容全部读入内存
    2、在内存中修改完毕
    3、将修改的结果覆盖写回硬盘

    优点:在修改期间硬盘上同一时刻只有一份数据
    缺点:占用内存过高
    with open('db.txt',mode='rt',encoding='utf-8') as f:
        data=f.read()
        new_data=data.replace('alex','alexdsb')
        print(new_data)
    
    with open('db.txt',mode='wt',encoding='utf-8') as f:
        f.write(new_data)
    一行一行的读,一行一行的改:
    1、以读的模式打开源文件,以写的模式打开一个临时文件
    2、然后用for循环读取原文件一行行内容,每读一行则修改一行,将修改的结果写入临时文件,直到把源文件都遍历完
    3、删除原文件,将临时文件重命名为原文件名

    优点:同一时刻在内存中只存在文件的一行内容
    缺点:在修改期间硬盘上同一份数据会保存两份
    import os
    
    with open('db.txt',mode='rt',encoding='utf-8') as src_f,
            open('.db.txt.swap',mode='wt',encoding='utf-8') as temp_f:
        for line in src_f:
            if 'alex' in line:
                line=line.replace('alex','alexdsb')
            temp_f.write(line)
    
    os.remove('db.txt')
    os.rename('.db.txt.swap','db.txt')
    

      

     
  • 相关阅读:
    [LeetCode] 139. Word Break 单词拆分
    [LeetCode] 140. Word Break II 单词拆分II
    [LeetCode] 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化
    [LeetCode] 206. Reverse Linked List 反向链表
    [LeetCode] 92. Reverse Linked List II 反向链表II
    [LeetCode] 258. Add Digits 加数字
    [LeetCode] 66. Plus One 加一
    [LeetCode] 21. Merge Two Sorted Lists 合并有序链表
    [LeetCode] 88. Merge Sorted Array 合并有序数组
    [LeetCode] 10. Regular Expression Matching 正则表达式匹配
  • 原文地址:https://www.cnblogs.com/zhutiancheng/p/9323676.html
Copyright © 2011-2022 走看看