zoukankan      html  css  js  c++  java
  • python文件IO操作

    一.python文件操作的步骤

    1.先open打开一个文件

      f = open("文件路径",“文件访问模式”)

    2.对文件的操作

    3.close关闭打开的文件

      f.close()

    也可以使用一行命令打开文件,不用close()关闭:with open("文件路径",“文件访问模式”) as f:

    二.文件的访问模式

    访问模式说明
    r (read) 只读模式,不能写(文件必须存在,不存在会报错)
    w (write) 只写模式,不能读(文件存在则会被覆盖内容(要千万注意),文件不存在则创建)
    a (append) 追加模式,不能读
    r+ 读写模式
    w+ 写读模式
    a+ 追加读模式
    rb 二进制读模式
    wb 二进制写模式
    ab 二进制追加模式
    rb+ 二进制读写模式
    wb+ 二进制写读模式
    ab+ 二进制追加读模式

    三.只读模式r

    只读模式读取数据

    f = open('/tmp/1.txt", encoding="utf-8")        # 默认就是只读模式
    # 如果不同平台,可能会字符集编码不一致,不一致的需要指定;一致的不用指定。
    
    data1 = f.read()
    data2 = f.read()                # 读第二遍
    
    f.close()
    
    print(data1)
    print("="*50)
    print(data2)    # 发现读第二遍没有结果;类似从上往下读了一遍,第二次读从最后开始了,所以就没结果了

    tell()与seek()的使用

    tell()  获取当前的读取数据的位置(可以理解为一个读光标当前的位置)

    seek(n)  从第n个字符开始读取(将读光标移动到第n个字符)

    f = open("/tmp/1.txt", "r")
    print(f.tell())            # 结果为0 (告诉你光标在哪,刚打开文件,光标在0位置)
    f.seek(5)                # 移你的光标到整个文件的第6个字符那(因为0为第一个)
    print(f.tell())            # 结果为5
    f.seek(2)                # 移你的光标到整个文件的第3个字符那,从0开始算,而不是从上面的位置开始算
    print(f.tell())            # 结果为2
    
    f.close()
    f = open("/tmp/1.txt", mode="r")
    
    data1 = f.read()        # 读了第一次后,光标在最后的位置
    f.seek(0)                # 通过seek(0)将光标又重置回开始的位置
    data2 = f.read()        # 再次读的话,就可以又重头读一遍了,data2变量的内容与data1的内容就一致了
    
    f.close()
    
    print(data1)
    print("="*20)
    print(data2)

    read(),readline()和readlins()三种读数据的方法

    f = open("/tmp/1.txt", "r")
    
    f.seek(5)                    # 光标移到第6个字符那里
    data1 = f.read()            # read是读整个文件在光标后面的所有字符(包括光标所在的那个字符),读完后,会把光标移到你读完的位置
    
    f.seek(5)                    # 光标重置到第6个字符那里
    data2 = f.readline()        # readline是读光标所在这一行的在光标后面的所有字符(包括光标所在的那个字符),读完后,会把光标移到你读完的位置
    
    f.seek(5)                    # 光标重置到第6个字符那里
    data3 = f.readlines()        # readlines和read类似,但把读的字符按行来区分做成了列表
    
    f.close()
    print(data1)
    print("="*30)
    print(data2)
    print("="*30)
    print(data3)

    循环读取文件

    f = open("/tmp/1.txt", "r")
    
    #循环方法一:
    for index, line in enumerate(f.readlines()):
         print(index, line.strip())        # 需要strip处理,否则会有换行
            
    # 循环方法二:这样效率较高,相当于是一行一行的读,而不是一次性全读(如果文件很大,那么一次性全读会速度很慢)
    for index, line in enumerate(f):
         print(index, line.strip())
    
    f.close()

    四.只写模式w

    只读模式下,只能向文件写内容,不能读取

    如果文件不存在,会自动创建

    如果文件已存在,则会先清空文件,再向文件写入数据

    f = open("/tmp/2.txt", 'w')    # 文件不存在,会帮你创建(类似shell里的 > 符号)
    
    #data = f.read()                  # 只写模式,读会报错
    f.write("hello
    ")            # 不加
    ,默认不换行写
    f.write("world
    ")
    f.truncate()                # 截断,括号里没有数字,那么就是不删除
    f.truncate(3)                # 截断,数字为3,就是保留前3个字节
    f.truncate(0)                # 截断,数字为0,就是全删除
     
    f.close()

    将九九乘法表写入文件

    f = open("/tmp/3.txt", "w")
    
    for i in range(1, 10):
        for j in range(1, i+1):
            f.write("{}*{}={} ".format(i, j, i*j))
        f.write("
    ")
    
    f.close()

    五.追加模式a

    追加模式下,文件不存在会自动创建,文件存在则会在文件末尾追加数据,不会覆盖原有数据

    f = open("/tmp/2.txt", 'a')    # 类似shell里的>>符
    
    f.write("hello
    ")    
    f.write("world
    ")
    f.truncate(0)                # 追加模式也可以使用truncate截取前面的数据
    
    f.close()

    六.list,tuple,dict.set的文件操作

    对于list,tuple,dict,set的数据需要使用二进制的方式读写,否则写入或读出的数据可能会乱码

    import pickle       # 数据持久性模块
    
    #列表可以换成元组,字典,集合等数据类型,效果相同
    list1 = [1, 2, 3, 4, "xianqian"]
    
    f = open("3.txt", mode="wb")
    
    # write的参数为str类型,不能直接写list,tuple,dict,set等数据类型,需要导入模块pickle,使用二进制模式wb写入,
    pickle.dump(list1, f)   # 将list1元素写入文件描述符f
    
    f.close()
    
    f1 = open("3.txt", mode="rb")
    
    data = pickle.load(f1)      # 将f1中的数据读出来
    print(data)
    
    f.close()

    七.编码与解码

    编码时使用什么字符集,解码时要用相同的字符集解码

    # 要注意文件本身自带的编解码和写入读出的手动编解码是两回事
    with open("1.txt",mode="wb") as f1:
        str1 = "xianqian嘿嘿"
        f1.write(str1.encode("utf-8"))
    
    
    with open("1.txt", mode="rb") as f2:
        data = f2.read()
        # data = f2.read().decode("utf-8")
    print(data)

    八.扩展了解r+模式

    # r+ mode
    
    f = open("httpd.conf", mode="r+")
    
    # # f.read()
    # f.readline()
    # f.seek(f.tell())
    # # f.seek(f.tell())
    # f.write("hello world
    ")
    
    for i in range(41):
        f.readline()
    
    f.seek(f.tell())
    f.write("Listen 8080
    ")
    
    
    f.close()
    
    # r+模式下,如果直接写,会从0位置处开始写,并且覆盖原位置的字符,写多少字符就覆盖多少字符,如果写入换行符,会覆盖原有的两个字符
    
    # r+模式下,使用了read()或readline()或readlines()后再写字符,会在文件最后写入,readline()读取后,会换行写;
    # read()或readlines()读取后会在同一行写
  • 相关阅读:
    1008 Elevator (20)(20 分)
    1007 Maximum Subsequence Sum (25)(25 分)
    1006 Sign In and Sign Out (25)(25 分)
    酒店前台管理系统主要代码截图
    酒店前台管理系统
    酒店前台管理系统需求分析
    session与cookie的区别和联系
    ldap的实现单点登录
    git如何使用
    javaweb项目中的web.xml
  • 原文地址:https://www.cnblogs.com/golinux/p/10809979.html
Copyright © 2011-2022 走看看