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

    打开文件三要素

    路径、打开方式、编码格式。不标注打开方式默认为只读。

    f1 = open('D:a.txt', encoding='utf-8', mode='r')

    f1 为文件句柄,也叫文件对象,所有的读写操作都是通过文件句柄完成的

    文件操作的三要素

    生成文件句柄

    文件的读/写,文件写操作必须以写形式打开文件,文件读操作必须以读或读写操作打开文件

    关闭文件句柄(若不关闭,则占用内存资源)

    文件的读

    read        #整个文件内容全部读取到内存中去,形成一个字符串

     f1 = open('D:a.txt', encoding='utf-8', mode='r')
     content = f1.read()
     print(content)
     f1.close()

    read(n)      #按照指定的字节数或字符数读取

    log 文件中内容为:我爱你中国

    当文件以r模式打开,n表示字符个数 f1
    = open('log',encoding='utf-8',mode='r') content = f1.read(3) print(content,type(content)) 我爱你 <class 'str'>
    f1.close()

    当文件以rb 模式代开,n表示字节数
    f1 = open('log',mode='rb')          #bytes 模式打开,不可以指定编码格式,是什么格式就以什么格式打开
    content = f1.read(3)              #编辑器编码为utf-8,而中文的utf-8 编码为3个字节表示一个文字。
    print(content,type(content))
    c = content.decode(encoding='utf-8')
    print(c)

      b'xe6x88x91' <class 'bytes'>
      我

    f1.close()

    readline        #每次读取一行,按顺序读取,读取内容以字符串格式存在

    log  文件内容
    1 我爱你中国
    2 alksdkjdsa
    3 jldfj
    4 k
    5 ...
    
    
    f1 = open('log',encoding='utf-8',mode='r')
    content = f1.readline()
    print(content)
    print(f1.readline())
    print(f1.readline())

     1 我爱你中国

      2 alksdkjdsa

      3 jldfj

    f1.close()

    readlines        #读取整个文件,把文件的每一行作为一个元素组成一个列表,不仅读取每一行内容还有换行符也一并读取。

    f1 = open('log',encoding='utf-8',mode='r')
    content = f1.readlines()
    print(content)
    ['1 我爱你中国
    ', '2 alksdkjdsa
    ', '3 jldfj
    ', '4 k
    ', '5 ...']
    f1.close()

    for 循环读取文件    #可以迭代式的逐行读取,读取一行完毕后自动从内存中清除,再读取下一行。不耗费内存,适合读取大文件

    f1 = open('log', encoding='utf-8')
    for i in f1:
        print(i)
    f1.close()

     whith open as ...   #无需关闭文件句柄

    whith open('log',encoding='utf-8',mode='r') as f1:
        content = f1.read

    r+          #文件的读写,可以读也可以写,但是不常用

    文件指针操作

    无论是文件的读还是写,读写操作后文件的指针都会停留在操作后的位置,例如readline 读取一行文件,指针就到了这一行的末尾,read读取全文,那么指针就到了文件最后。

    seek(offset,whence)

    • offset -- 开始的偏移量,也就是代表需要移动偏移的字节数

    • whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

    log 文件内容
    abcdefg
    
    f1 = open('log', encoding='utf-8', mode='r')
    f1.seek(2,0)                    #以文件开头作为起始偏移量未二个字节
    print(f1.read())
    f1.close()
    
    输出:
    cdefg

    seek(0)        #表示回到文件的开始

    seek(0,2)          #表示回到文件的结尾

    tell()     获取当前文件指针位置(字节)

    log 内容 abcdefg f2 = open('log',encoding='utf-8') f2.read() print(f2.tell())                #英文字母一个字母对应一个字节 7 log1 内容 abcdefg文 f3 = open('log1',encoding='utf-8') f3.read() print(f3.tell())                #utf-8编码下中文字符占3个字节 10

    文件的写

    w       写模式        #覆盖写入,如果文件事先不存在则创建。文件打开的那一刻就已经清空了文件原有的内容,此处再用seek()已经无任何作用

    w+    写读模式       #可以写也可以读。与w 特性完全一样,只是在写的基础上加入了读的模式。

    a  追加写        #从文件的末尾处追加写入

    log2内容
    我是
    
    f1 = open('log2', encoding='utf-8', mode='a')
    f1.write('
    中国人')                  #加
    会换行,不加则会直接追加到后面
    f1.close()
    
    log2内容
    我是
    中国人

    a+  

    f1 = open('log2', encoding='utf-8', mode='a+')
    f1.write('fdsafdsafdsagfdg')
    f1.seek(0)                          #指针调整到文件开头,否则读取内容为空
    print(f1.read())
    f1.close()                        

    应用示例

    将文件中的所有kobe改为james

    业务逻辑

    1,打开原文件,产生文件句柄。
    2,创建新文件,产生文件句柄。
    3,读取原文件,进行修改,写入新文件。
    4,将原文件删除。
    5,新文件重命名原文件。

    代码

    import os
    with open('file_test', encoding='utf-8') as f1,
        open('file_test.bak', encoding='utf-8', mode='w') as f2:
        for line in f1:
            new_line = line.replace('kobe','james')
            f2.write(new_line)
    os.remove('file_test')
    os.rename('file_test.bak','file_test')

    总结:

    文件的操作模式有6种:r、r+、w、w+、a、a+,在上面模式基础上可以实现rb、r+b、wb、w+b、ab、a+b的bytes模式。

    实际工作中常用的是r w a,读写同时进行容易出错谨慎使用。图片,视频等文件的操作使用b模式。

     

     

  • 相关阅读:
    xml的语法与创建
    smarty实现缓存
    Smarty中一些标签的使用
    smarty中的变量使用
    商品中的分页类
    引入百度编辑器
    VB.NET操作Word大全
    Android 自带图标库 android.R.drawable
    DataGridViewComboxCell值无效 的原因
    windows7/win7 iis的安装与配置(图解教程)
  • 原文地址:https://www.cnblogs.com/fanggege/p/10859532.html
Copyright © 2011-2022 走看看