zoukankan      html  css  js  c++  java
  • 文件基本操作

    读取一个文件需要有:地址,读取方式,编码格式;

    假设d盘根目录有一个文件叫做艾克.txt,那么读取代码为:

    f = open('d:艾克',mode='r',encoding='utf-8') #open(地址,读出方式,编码格式)

    这是新建一个对象,每次读取后都要用f.close()进行退出,不然会一直读取占用内存,所以一般都采用下列方法读取,不用每次都输入close退出:

    with open('d:艾克',mode='r',encoding='utf-8') as f:

    读取方式:

    r 只读 只用于读,打印时,控制台会打印出读取文件内容,写入或追加会报错
    rb 以二进制打开一个文件用于只读 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。带b的都是以二进制的格式操作文件,他们主要是操作非文字文件:图片,音频,视频等,并且,如果是以带有b的模式操作文件,那么不用声明编码方式。在带有写入或者追加的模式下进行b模式时,进行写入文字操作,需要进行转码操作
    r+ 打开一个文件用于读写 打开一个文件用于读写。文件指针默认将会放在文件的开头。如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。解决办法是先读一遍再写入,此时光标位置会是在最后面,写入内容将从后边开始添加,不会将前边内容覆盖
    r+b 以二进制打开一个文件用于读写 以二进制打开一个文件用于读写。 结合上方rb与r+特性进行参考
         
    w 只写 只用写入,写入执行时先会将这个文件清空,清空后再写入,打印时不会在控制台打印出写入文件内容 。若无该文件,会先在该目录创建一个文件再写入
    wb 以二进制打开一个文件用于只写 以二进制格式打开一个文件只用于写入。写入执行时先会将这个文件清空,清空后再写入,打印时不会在控制台打印出写入文件内容 。若无该文件,会先在该目录创建一个文件再写入,一般用于非文本文件如:图片,音频,视频等。 并且,如果是以带有b的模式操作文件,那么不用声明编码方式。在带有写入或者追加的模式下进行b模式时,进行写入文字操作,需要进行转码操作
    w+ 打开一个文件用于写读 打开一个文件用于写读,写入执行时先会将这个文件清空,清空后再写入,打印时不会在控制台打印出写入文件内容。写入字符串后可以指定光标位置继续写入,重新运行后再次清空
    w+b 以二进制打开一个文件用于写读 以二进制打开一个文件用于写读。 结合上方wb与w+特性进行参考
         
    a 追加 只用于追加,不会对文件进行清空操作,追加默认是在文件的最后
    ab 以二进制打开一个文件用于追加 以二进制打开一个文件用于追加。不会对文件进行清空操作,追加默认是在文件的最后。特性与rb、wb同理 
    a+ 打开一个文件用于追加读 打开一个文件用于追加读, 不会对文件进行清空操作,追加默认是在文件的最后。特性与rb、wb同理 
    a+b 以二进制打开一个文件用于追加读 以二进制打开一个文件用于追加读, 不会对文件进行清空操作,追加默认是在文件的最后。特性与rb、wb同理 

    部分测试代码:

    r、rb、r+

    #演示文件夹地址为相对路径,即在工作文件夹的目录下
    #mode = 'r'
    l = open('艾克',mode='r',encoding='utf-8')
    # reading = l.read()
    # print(reading)
    # l.close()
    
    # mode = 'rb'
    l = open('艾克',mode='rb')
    reading = l.read()
    print(reading)
    l.close()
    
    
    #with as 模式读取文件
    #读写 mode = 'r+'
    # 这个模式下,如果你在读写模式下,先写后读,那么文件就会出问题,
    # 因为默认光标是在文件的最开始,你要是先写,则写入的内容会将原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。
    # 解决办法是先读一遍再写入,此时光标位置会是在最后面,写入内容将从后边开始添加,不会将前边内容覆盖
    with open('艾克',mode='r+',encoding='utf-8') as l:
        # print(l.tell())
        # l.seek(0)
        print(l.read())
        # l.seek(6)
        l.write('你好')
        print(l.read())

    w、wb、w+

    # made = 'w'
    # l = open('aike',mode='w',encoding='utf-8')
    # reading = l.write('艾克你好艾克你好艾克你好艾克你好艾克你好')
    # l.close()
    
    #mode = 'wb'
    l = open('aike',mode='wb')
    reading = l.write('艾克你好艾克你好艾克你好艾克你好艾克你好'.encode('utf-8'))
    l.close()
    
    #写读 mode = 'w+' 写入时,每一次运行都会将所有内容清空再写入,写入一条后可以指定光标位置继续写入
    with open('艾克',mode='w+',encoding='utf-8') as l:
        # l.write('你好')
        # l.seek(3)
        # l.write('艾克')
        # print(l.read())
        l.write('zzz')
        print(l.read())

    其它功能用法:

    # f = open('log',mode='r+',encoding='utf-8')
    # content = f.read(3)  # 读出来的都是字符
    # f.seek(3)  # 是按照字节定光标的位置
    # f.tell() 告诉你光标的位置
    # print(f.tell())
    # content = f.read()
    # print(content)
    # f.tell()
    # f.readable()  # 是否刻度
    # line = f.readline()  # 一行一行的读
    # line = f.readlines()  # 每一行当成列表中的一个元素,添加到list中
    # f.truncate(4)
    # for line in f:
    #     print(line)
    # f.close()

    注:光标位置的指定是以字节来数,而读取时以字符。

  • 相关阅读:
    64位Windows2008下插入Oracle中文乱码问题解决
    .net自定义WebService WSDL
    IE8下调用Active控件
    IIS7.5下发布应用程序备忘
    在aws ec2上使用root用户登录
    win2008 服务器文件夹权限配置
    thinkphp3.1 多表联合查询代码
    并发 并行 同步 异步 多线程的区别
    学习ES6生成器(Generator)
    node.js+socket.io配置详解
  • 原文地址:https://www.cnblogs.com/aizhinong/p/11342033.html
Copyright © 2011-2022 走看看