zoukankan      html  css  js  c++  java
  • python里文件读写操作

    文件读写操作一种基本操作,但是里面也存在很多需要注意的问题,例如字符编码、内存缓冲、指针位置等等。如果忽视这些问题就会引起很多不必要的麻烦。简单来说,文件的读写分为几个过程:

    1. 打开文件,并定义操作文件的方式(读、写or读写)
    2. 通过句柄对文件进行操作
    3. 关闭文件

    打开文件的模式通常有以下几种:

    • r,只读模式(默认)
    • w,只写模式(不可读,通常用次方式创造一个新文件)
    • a,追加模式(可读;不存在就会创建,存在会追加)
    • 同时还存在,r+(指针位置),w+,a+,同时也存在rb,wb,ab代表处理二进制文件

    文件的指针问题:

    首先,打开一个文件,如下:

     1 漂泊在无尽的夜
     2 遭受了无数的欺骗
     3 冠冕堂皇的借口它只是你的诡辩
     4 我心中有梦对你谈的利弊根本不屑
     5 因为
     6 前方的路还很远
     7 不能局限在一个焦点
     8 如果你眼光狭隘不懂蜕变,怎能看到我的心里面
     9 我渴望的不是稳定、数十年磨一剑
    10 我想要出去闯、迎接创新不断改变
    11 希望你们能发现这世界的真善美
    12 别再心机boy为了利益像个鬼
    13 就算现在你能将我击退
    14 待我卷土重来东山再起让你后悔

    此文件编码是gbk模式的,所以打开文件时,要说明encoding='utf-8’,才能正确打开文件。

    • 当我们对一个文件进行只读操作时,指针的起始位置都会在文件的起始位置,但是注意一个问题,当使用seek()切换指针位置的时候,指针偏移的量是代表的字节,所以,如果以rb的形式打开,就不会报错,但是如果以uft-8的形式打开,除非是seek()的字节是三的倍数,否则就会报错(因为utf8中一个汉字代表三个字节)。
    with open('file_wr.text','r',encoding='utf-8') as f:
        f.seek(3)
        print(f.readline())
    result:
    泊在无尽的夜
    with open(
    'file_wr.text','r',encoding='utf-8') as f: f.seek(4) print(f.readline()) result:
    Traceback (most recent call last): File
    "D:/pytwice/day1/homework_for_day1/文件读写.py", line 5, in <module> print(f.readline()) File "C:Usersz00428606AppDataLocalProgramsPythonPython36libcodecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte
    • 当我们对文件进行写操作的时候,无论如何偏移指针,就相当于对一个空文件从零开始进行写操作。
    • 当我们对文件进行r+操作的时候,可以认为有两个指针,一个是读指针,一个是写指针,读指针和只读模式一样,写指针则是在文件的末尾进行追加操作。
    • 对于w+......和w感觉没什么区别,读也读不出来......忘记他吧!

    还有一个很重要的事情:flush。

    我们进行文件读写操作时,写东西进去的时候,数据首先会进入内存缓冲区,然后再存到硬盘上,但是,存入内存缓冲区的文件不会一收到数据就发给硬盘,这样效率太低了,浪费资源。所以,一般情况下,都是等待内存缓冲区存好足够多的数据的时候,才会统一存到硬盘上面。这种情况下,就很大程度的节约了资源。但是,在某些特殊场景下,这种方式存在重大的安全隐患,比如突然断电、死机等等意外情况都会导致内存缓冲区的数据清空,在一些特殊的行业(金融、银行等)就会存在很大的风险(你刚存完钱的时候ATM机后台断电了,你找妈妈哭去!)。所以,有一种方法可以实现,及时刷新,发一条数据,内存收到,就会立马存到硬盘上。就是flush功能。

    # Author:Zhang Zhao
    
    with open('file_wr.text','w',encoding='utf-8') as f:
        f.write('zz')
        f.flush()

    看看就好!

    忘记一个!!tell功能,很简单,就是显示指针的位置:

    # Author:Zhang Zhao
    
    with open('file_wr.text','r+',encoding='utf-8') as f:
        f.seek(6)
        print(f.tell())
    
    result:6
  • 相关阅读:
    前端工程师应该具备的三种思维
    7 个 Bootstrap 在线编辑器用于快速开发响应式网站
    js阻止浏览器的默认行为以及停止事件冒泡(用JQuery实现回车提交)
    JAVASCRIPT加密方法,JS加密解密综述(7种)
    JavaScript生成GUID的方法
    js判断是否为手机访问
    Jquery中parent()和parents()
    jQuery中ajax和post处理json的不同
    JQuery实现回车代替Tab键(按回车跳到下一栏)
    js中replace的用法
  • 原文地址:https://www.cnblogs.com/zz1314/p/10329441.html
Copyright © 2011-2022 走看看