• PythonDay08


    第八章

    今日内容

    文件操作

    • 读操作

    • 写操作

    • +操作

    • 其他操作

    读操作

    r模式
    f = open('test.txt', mode='r', encoding='utf-8')
    print(f.read())
    f.close()

    with open('test.txt', 'r', encoding='utf-8')as f:
    print(f.read())

    # 两种方式获得文件句柄,推荐with,运行完之后自动关闭文件
    rb模式
    with open('test.txt', 'rb', encoding='utf-8')as f:
    print(f.read())
    # 读出来的是字节

    建议使用相对路径

    读操作

    f.read()                # 不建议用
    f.read(读取的字符数)
    f.readline() # 每次读取一行,每行最后有一个
    f.readlines() # 将每一行形成一个元素,并添加到一个列表中,当文件过大时,内存会崩
    推荐使用,先拿到文件句柄
    with open('1','r',encoding='utf-8')as f:
    for i in f:
    print(i)

    写操作

    使用w模式的时候,在打开文件的时候就就会把文件中的所有内容都清空,然后在操作
    如果文件不存在使用w模式会创建文件,文件存在w模式是覆盖写,在打开文件时会把文件中所有的内容清空.
    f.write()

    wb模式下,不可以指定打开文件的编辑,但是写文件的时候必须将字符串转换成utf-8的bytes数据

    追加

    只要是a或者ab,a+都是在文件的末尾写入,不论光标在任何位置.
    在追加模式下,我们写入的内容后追加在文件的末尾
    a模式如果文件不存在就会创建一个新文件
    ab模式和上面一样,没有太大区别
    # 面试题:
    # 当文件较大时,使用for循环进行读取
    # f = open('t1',mode="r",encoding="utf-8")
    # for i in f:
    #     print(i.strip())

    r+模式

    r+模式一定要记住是先读后写

    f1 = open('test.txt',mode='r+',encoding='utf-8')
    msg = f1.read()
    f1.write('千山鸟飞绝,万径人踪灭')
    f1.flush()
    f1.close()
    print(msg)
    结果:
    正常的读取之后,写在结尾

    深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.

    w+模式

    先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用

    a+模式

    a+模式下,不论是先读还是后读,都是读不到数据的

    其他操作

    seek()
    seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
    通常我们使用seek都是移动到开头或者结尾
    移动到开头:seek(0,0) 可以看做成seek(0)
    seek(6)这种如果是单数并且不是0的就是按照字节来移动光标
    移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
    
    tell()
    使用tell()可以帮我们获取当前光标在什么位置
    

    文件修改

    文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字

    错误示范,使用read,当文件内容过大,会导致内存溢出
    import os
    with open("../path1/小娃娃", mode="r", encoding="utf-8") as f1,
    open("../path1/小娃娃_new", mode="w", encoding="UTF-8") as f2:
        content = f1.read()
        new_content = content.replace("冰糖葫芦", "⼤白梨")
        f2.write(new_content)
    os.remove("../path1/小娃娃") # 删除源文件
    os.rename("../path1/小娃娃_new", "小娃娃") # 重命名新文件
    弊端: ⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作
    
    正确代码:
    import os
    with open("小娃娃", mode="r", encoding="utf-8") as f1,
    open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
        for line in f1:
            new_line = line.replace("大白梨", "冰糖葫芦")
            f2.write(new_line)
    os.remove("小娃娃") # 删除源⽂文件
    os.rename("小娃娃_new", "小娃娃") # 重命名新文件
    

     

  • 相关阅读:
    JMM简述
    spring简读
    Linux常用命令
    基于java的八大排序实现
    数据库事务说明
    BIO、NIO、AIO区别与联系
    ThreadLocal 是什么?有哪些使用场景?
    ConcurrentHashMap 和 Hashtable 比较,为什么推荐使用ConcurrentHashMap?
    sychronized设计原理
    MySQL索引详解
  • 原文地址:https://www.cnblogs.com/xuyuwei/p/11342285.html
Copyright © 2020-2023  润新知