• (1)python文件操作


    【1】文件的读写追加(rwa)

    【1.0】基本形式

    f = open("d:\python\temp\1.txt",encoding="utf-8")   # 读:文件句柄,也可以 
    f3 = open("1.txt",'r',encoding="utf-8")
    f1 = open("1.txt",'w',encoding="utf-8")  # 写:文件句柄,是创建一个文件,会覆盖现有文件
    f2 = open("1.txt",'a',encoding="utf-8")  # 追加:文件句柄
    f3.close()   # 文件关闭
    f.read()  # 读取文件内容
    f.write('111') # 写入内容到文件
    f3.closed()    # 判断文件是否关闭
    print(f3.read(5))  # 读取且移动5个字符,结果:我有一个梦想 =》我有一个梦
    print(f3.tell())  # 查看文件句柄指针指向的字符位置,因为用的是utf字符集,所以一个中文占3个字节,结果:15
    print(f3.readline().strip())   # 它会读当前行指针到改行行末的数据,结果:我有一个梦想=》想,因为上面的read已经移动指针到这里
    print(f3.tell())       # 结果:20,为什么是20?改行我有一个梦想是6个字符,utf就是18,加上readline 换行其实
    也是2个字符
    f3.seek(0)   # 文件句柄指针指向文件开头
    print(f3.seekable())  # 判断文件句柄指向是否可以移动,返回bool值
    print(f3.read(5))  # 结果:我有一个梦想=》我有一个梦
    print(f3.seek(3))  # 当前指针位置移动到第3个字节的位置,因为是utf8所以一个中文占3个字节,这里其实就是移动到了第2个字符的位置
    print(f3.readline().strip())   # 结果:有一个梦想
    print(f3.flush)     # 把内存buffer中的数据刷新同步到磁盘,一般情况下是等文件buffer(可能) 满了才批量刷到磁盘

    【1.1】读:f = open("1.txt",'r',encoding="utf-8")

    f = open("d:\python\temp\1.txt",encoding="utf-8")   # 读:文件句柄,也可以 f3 = open("1.txt",'r',encoding="utf-8")
    data = f.read()
    print(f.readable())   # 判断文件句柄指向是否可读,返回bool值  ,# 也可以 data = open("d:\python\temp\1.txt",encoding="utf-8").read()
    data1 = f.read()
    print(data,data1)     # 为什么data1输出时空的?因为文件里有一个阅读指针,在data的时候已经进行过 f.read(),阅读到文件末尾了,再read()就从获取不到内容了
    f.close()             # 关闭文件

    【1.2】写:f = open("1.txt",'w',encoding="utf-8")

    会创建一个空文件

    f1 = open("1.txt",'w',encoding="utf-8")  # 写:文件句柄,是创建一个空文件,会覆盖现有文件
    f1.write("今天天气好晴朗")     # 在文件末尾写入
    print(f1.writable())         # 判断文件句柄指向是否可写,返回bool值
    f1.write("处处好风光~好风光")  # 如果这样写,默认会放到同一行,除非在上一行加上换行符
    
    f1.close()

    【1.3】追加:f = open("1.txt",'a',encoding="utf-8") 

    文件存在即追加,文件不存在则新建

    f2 = open("1.txt",'a',encoding="utf-8")  # 追加:文件句柄
    f2.write("你渴望知识吗?")
    f2.close()

    【2】高级查询:文件句柄指针

    【2.1】基本遍历

    # print(f3.readline())   # 阅读指针当前行,并把文件指针指向下一行
    # print(f3.readlines())       # f3.readlines() 把文件内容封装成列表,每行算一个元素,且元素值末尾带有
    
    for line in f3.readlines():   # 遍历文件中的每一行
        print(line.strip())
    
    for index,line in enumerate(f3.readlines()):   # 只查看第3行
        if index == 2:  # 因为从0开始,第3行下标就是2
            print(line.strip())
    for line in f3:  # 迭代器
        print(line)

    【2.2】文件句柄指针位置操作

    print(f3.read(5))  # 读取且移动5个字符,结果:我有一个梦想 =》我有一个梦
    print(f3.tell())  # 查看文件句柄指针指向的字符位置,因为用的是utf字符集,所以一个中文占3个字节,结果:15
    print(f3.readline().strip())   # 它会读当前行指针到改行行末的数据,结果:我有一个梦想=》想,因为上面的read已经移动指针到这里
    print(f3.tell())       # 结果:20,为什么是20?改行我有一个梦想是6个字符,utf就是18,加上readline 换行其实
    也是2个字符
    f3.seek(0)   # 文件句柄指针指向文件开头
    print(f3.seekable())  # 判断文件句柄指向是否可以移动,返回bool值
    print(f3.read(5))  # 结果:我有一个梦想=》我有一个梦
    print(f3.seek(3))  # 当前指针位置移动到第3个字节的位置,因为是utf8所以一个中文占3个字节,这里其实就是移动到了第2个字符的位置
    print(f3.readline().strip())   # 结果:有一个梦想
    print(f3.flush)     # 把内存buffer中的数据刷新同步到磁盘,一般情况下是等文件buffer(可能) 满了才批量刷到磁盘

    【3】同时多个操作(比如同时读写)

    【3.1】读写:一般形式(r+,w+,a+)

    f = open('1.txt', 'r+',encoding="utf-8")    # 读+写(3.0+只能在文件末尾追加)
    f = open('1.txt', 'w+',encoding="utf-8")    # 写+读,也会有w的特性,会新建文件,如果文件存在则用空白文件覆盖(3.0+只能在文件末尾写入追加)
    f = open('1.txt', 'a+',encoding="utf-8")    # 追加+读

    【3.2】二进制读写(rb+,wb+,ab+)

    f = open('1.txt', 'ab+')
    f.write('~~~~~~~11111111111~~~~~~~~~'.encode('utf8'))
    f.write('~~~~~~~222222222222222~~~~~~~~~'.encode('utf8'))
    data=f.read()
    print(data)
    f.close()

    同理 web+  wb   rb 等就不用说了吧?

    【4】修改文件内容

    【4.1】指定字符串替换

    """
    如何修改文件?
    (1)从原文件逐行读
    (2)定位是否有到自己修改的位置
        如果不是则把该行写入到新文件
        如果定位到了,则修改后,把改行写入到新文件
    原文:
        我有一个梦想
        就是飞向海洋
        无边无际的海
        是我心中的向往
    修改:
    无边无际的海=》大海啊大海
    """
    
    f = open("梦想.txt",'r',encoding='utf-8')
    f_new = open("new_梦想.txt",'w',encoding="utf-8")
    for line in f:
        if "无边无际的海" in line:
            line = line.replace("无边无际的海","大海啊大海")
        f_new.write(line)

       

    【4.2】文件操作实现sed

    # Auth chaoqun.guo
    """
    如何修改文件?
    (1)从原文件逐行读
    (2)定位是否有到自己修改的位置
        如果不是则把该行写入到新文件
        如果定位到了,则修改后,把改行写入到新文件
    原文:
        我有一个梦想
        就是飞向海洋
        无边无际的海
        是我心中的向往
    修改:
    无边无际的海=》大海啊大海
    """
    import sys
    
    f = open("梦想.txt",'r',encoding='utf-8')
    f_new = open("new_梦想.txt",'w',encoding="utf-8")
    
    find_str = sys.argv[1]
    replace_str = sys.argv[2]
    print(find_str,replace_str)
    
    for line in f:
        if find_str in line:
            line = line.replace(find_str,replace_str)
        f_new.write(line)
    f.close()
    f_new.close()

    sys.argv是什么?参考:https://www.cnblogs.com/aland-1415/p/6613449.html

      

          

       

     完成!

    【5】使用 with 关键字避免文件忘记 close   

    # Auth chaoqun.guo
    # (1)with 语句:为了避免打开文件后忘记关闭
    with open('梦想.txt','r',encoding="utf-8") as f:    # 代替了 f = open("梦想.txt",'r',encoding='utf-8')
        for line in f:
            print(line.strip())
    
    print("-------------------------".center(50,'-'))
    # (2)with 写多个语句
    with open('梦想.txt','r',encoding="utf-8") as f,
        open('new_梦想.txt','r',encoding='utf-8') as new_f:
        for line in f:
            print(line.strip())
        for line in new_f:
            print(line.strip())

    【案例】进度条

    import sys
    import time
    
    for i in range(50):
        sys.stdout.write('#')
        sys.stdout.flush()
        time.sleep(0.1)
  • 相关阅读:
    模板
    洛谷
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    洛谷
    洛谷
    洛谷
    NOIP 普及组 2016 海港
  • 原文地址:https://www.cnblogs.com/gered/p/13938390.html
Copyright © 2020-2023  润新知