• 文件操作


    一文件操作

    使用open()函数来打开一个文件,

    打开文件的方式:

    r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b.默认使用的是r(只读模式)

    二.只读操作

    1.

    f = open("a1.txt",mode="r",encoding="utf-8")
    content = f.read()
    print(content)
    f.close()
    

     需要注意encoding表⽰编码集. 根据⽂件的实际保存编码进⾏获取数据, 对于我们⽽⾔. 更
    多的是utf-8.

    2.rb读出来的数据是bytes类型,在rb模式下.不能选择encoding字符集

    f = open("a1.txt",mode="r")
    content = f.read()
    print(content)
    f.close()

    rb的作⽤: 在读取非⽂本⽂件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要⽤到
    rb. 因为这种数据是没办法直接显⽰出来的. 在后⾯我们⽂件上传下载的时候还会⽤到. 还有我们看到的直播

    3.绝对路径和相对路径:

    (1)绝对路径:从磁盘根目录开始一直到文件名

    (2)相对路径:同一个文件夹下的文件,相对于当前程序所在文件夹而言,如果在同一文件夹中,则相对路径就是这个文件夹名.如果在上一层文件夹,则要../

    推荐使用相对路径.因为在我们把程序拷贝给别人使用时,直接把项目拷走就能运行.但用绝对路径还需要拷贝外部文件.

    三.读取文件的方法:

    1.read()将文件中的内容全部读取出来.弊端,占内存.如果文件过大容易导致内存崩溃

    f = open("a1.txt", mode="r", encoding="utf-8")
    s = f.read()
    print(s)
    f.close()
    结果:
    老男孩是最好的培训机构,
    全心全意为学生服务,
    只为学生未来,不为牟利。
    我说的都是真的。哈哈

    2.read(n)读取n 个字符,需要注意的是,如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,则读取出来的是n个字节

    f = open("a1.txt", mode="r", encoding="utf-8")
    s = f.read(3)
    print(s)
    f.close()
    结果:
    老男孩
    f = open("a1.txt", mode="r", encoding="utf-8")
    s = f.read(3)
    s2 = f.read(3)
    print(s)
    print(s2)
    f.close()
    老男孩
    是最好

    3.readline()一次读取一行数据,注意:readline()结尾,注意每次读取出来的数据都会有一个 所以呢,需要我们使用strip()来去掉 或者空格
    4.readlines()将每一行形成一个元素,放在一个列表中.将所有内容都读取出来,所以也是容易内存崩溃的

    f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
    lst = f.readlines()
    print(lst)
    for line in lst:
     print(line.strip())
    View Code

    5.循环读取.这种方式是组好的,每次读取一行内容,不会产生内存溢出的问题

    f = open("a1.txt", mode="r", encoding="utf-8")
    for line in f:
        print(line.strip())

    注意读取完文件的句柄一定要关闭f.close()
    四.

    写模式(w,wb)

    写的时候注意,如果没有文件.则会创建文件,如果文件存在,则将原件中原来的内容删除,在写入新内容

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

     五.追加(a,ab)

      在追加模式下.我们写入的内容会追加在文件的结尾

    f = open("小娃娃", mode="a", encoding="utf-8")
    f.write("麻花藤的最爱")
    f.close

    六.读写模式(r+,r+b)
    对于读写模式.必须先读.因为默认光标是在开头的.准备读取的.当读完了之后再进行写入,我们使用的频率最高的是r+

    f = open("⼩娃娃", mode="r+", encoding="utf-8")
    content = f.read()
    f.write("麻花藤的最爱")
    print(content)
    f.close()
    结果:
    正常的读取之后, 写在结尾

     r+模式下. 必须是先读取. 然后再写入

    七.写读(w+ w+b)

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

     八追加读(a+)

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

    f = open("⼩娃娃", mode="a+", encoding="utf-8")
    f.write("⻢化腾")
    content = f.read()
    print(content)
    f.close

    九.其他相关操作

    1.seek(n)光标移动到n的位置,注意,移动的单位是byte.所以如果是utf-8的中文部分要是3的倍数

          通常我们使用seek都是移动到开头或者结尾.

         移动到开头:seek(0)

         移动到结尾:seek(0,2)seek的第二个参数表示从哪个位置进行偏移,默认是0表示开头,1表示当前位置,2表示结尾

    f = open("⼩娃娃", mode="r+", encoding="utf-8")
    f.seek(0) # 光标移动到开头
    content = f.read() # 读取内容, 此时光标移动到结尾
    print(content)
    f.seek(0) # 再次将光标移动到开头
    f.seek(0, 2) # 将光标移动到结尾
    content2 = f.read() # 读取内容. 什么都没有
    print(content2)
    f.seek(0) # 移动到开头
    f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
    f.close()

    2.tell() 使用tell()可以帮我们获取当前光标位置

    f = open("⼩娃娃", mode="r+", encoding="utf-8")
    f.seek(0) # 光标移动到开头
    content = f.read() # 读取内容, 此时光标移动到结尾
    print(content)
    f.seek(0) # 再次将光标移动到开头
    f.seek(0, 2) # 将光标移动到结尾
    content2 = f.read() # 读取内容. 什么都没有
    print(content2)
    f.seek(0) # 移动到开头
    f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
    print(f.tell()) # 光标位置9
    f.close

    深坑注意:在r+模式下.如果读取内容.无论读取内容,不论读取内容多少.光标显示的是多少.在写入或者操作文件的时候都是在结尾进行的操作
    所以如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进⾏截断
    关于truncate(n), 如果给出了n. 则从开头开头进⾏截断, 如果不给n, 则从当前位置截断. 后⾯
    的内容将会被删除
    十. 修改⽂件以及另⼀种打开⽂件的⽅式
    ⽂件修改: 只能将⽂件中的内容读取到内存中, 将信息修改完毕, 然后将源⽂件删除, 将新
    ⽂件的名字改成老⽂件的名字.

    # ⽂件修改
    import os
    with open("⼩娃娃", mode="r", encoding="utf-8") as f1,
     open("⼩娃娃_new", mode="w", encoding="UTF-8") as f2:
     content = f1.read()
     new_content = content.replace("冰糖葫芦", "⼤⽩梨")
     f2.write(new_content)
    os.remove("⼩娃娃") # 删除源⽂件
    os.rename("⼩娃娃_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", "⼩娃娃") # 重命名新⽂件
  • 相关阅读:
    Mac电脑,Andorid studio 配置 Flutter
    java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager
    #Java Web累积#关于MUI的上滑和下拉加载
    #iOS问题记录#WKWebView 闪退异常
    #iOS问题记录#UITableView加载后直接滑动倒最底部
    #Java Web累积#JS动态加载所有同name的select的option
    #iOS问题记录# UIWebView滑动到底部
    #Java Web累积#表格<table>中隐藏列做备用数据
    #iOS问题记录# UITextview富文本链接,禁止长按事件
    Day 1:自定义tableview cell xib版
  • 原文地址:https://www.cnblogs.com/Bug66/p/9431254.html
Copyright © 2020-2023  润新知