zoukankan      html  css  js  c++  java
  • day08 Python 文件操作

    一、文件读取方法

    1、read() 将⽂件中的内容全部读取出来。

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

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

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

    3、readline() ⼀次读取⼀行数据, 注意: readline()结尾, 注意每次读取出来的数据都会有⼀ 个" " 所以呢. 需要我们使用strip()⽅法来去掉" "或者空格

    f = open("test.txt", mode="r", encoding="utf-8")
    content = f.readline()
    content2 = f.readline()
    print(content)
    

    4、readlines()将每⼀行形成一个元素,放到⼀个列列表中.将所有的内容都读取出来

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

    5、循环文件句柄来读取.这种方式是最好的.每次读取⼀行内容.不会产生内存溢出的问题。这里注意文件句柄是一个可以迭代的对象。

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

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

    二、写模式(w, wb)

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

    f = open("⼩小娃娃", mode="w", encoding="utf-8")
    f.write("⾦金金⽑毛狮王")
    f.flush()
    f.close()

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

    f = open("⼩小娃娃", mode="wb")
    f.write("⾦金金⽑毛狮王".encode("utf-8")) 
    f.flush()
    f.close()

    三. 追加(a, ab)

    只要a,ab或者a+,都是在文件最后追加内容,无论光标在哪里。

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

    四. 读写模式(r+, r+b)

    对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进行写入. 我们以后使⽤频率最⾼的模式就是r+

    正确操作是:

    f = open("⼩小娃娃", mode="a", encoding="utf-8")
    f.write("12345678")
    f.flush()
    f.close()
     
    
    f = open("⼩小娃娃", mode="r+", encoding="utf-8")
    content = f.read()
    f.write("test")
    print(content)
    f.flush()
    f.close()

    结果:
    正常的读取之后, 写在结尾

    错误操作:

    f = open("⼩小娃娃", mode="r+", encoding="utf-8")
    f.write("哈哈")
    content = f.read()
    print(content)
    f.flush()
    f.close()
    
    

    结果: 将开头的内容改写成了了"哈哈", 然后读取的内容是后面的内容.

    所以记住: r+模式下. 必须是先读取. 然后再写入

    五. 写读(w+, w+b)
    先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常⽤

    f = open("⼩小娃娃", mode="w+", encoding="utf-8")
    f.write("哈哈")
    content = f.read()
    print(content)
    f.flush()
    f.close()

    有⼈会说. 先读不就好了么? 错. w+ 模式下, 一开始读取不到数据. 然后写的时候再将原来的内容清空. 所以很少用。

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

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

    还有⼀一些其他的带b的操作. 就不多赘述了了. 就是把字符换成字节. 仅此⽽而已

    七. 其他相关操作

    1. seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中文部分要是3的倍数,因为在utf-8中一个中文是三个字节.通常我们使用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.flush()
    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.flush()
    f.close()
    

    3. truncate()截断⽂文件

    f = open("⼩小娃娃", mode="w", encoding="utf-8")
    f.write("哈哈") # 写⼊入两个字符
    f.seek(3) # 光标移动到3, 也就是两个字中间 f.truncate() # 删掉光标后⾯面的所有内容 f.close()
     
    
    f = open("⼩小娃娃", mode="r+", encoding="utf-8") content = f.read(3) # 读取12个字符
    f.seek(4)
    print(f.tell())
    
    f.truncate()
    # print(content) # 后⾯面的所有内容全部都删掉
    f.flush()
    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", "⼩小娃娃")  # 重命名新文件     
    

      

  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/fanghongbo/p/9857629.html
Copyright © 2011-2022 走看看