python文件讀寫 with open()

一跑筝、文件寫入和讀取

  def write(self, data):  # 寫入
        with open(self.filename, 'ab') as f:
            pickle.dump(data, f)


 def readiter(self):  # 讀取
        with open(self.filename, 'rb') as f:
            while True:
                try:
                    data = pickle.load(f)
                    yield data
                except:
                    break

二、python源碼解釋

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): # known special case of open
    """
    Open file and return a stream.  Raise OSError upon failure.
    
    file is either a text or byte string giving the name (and the path
    if the file isn't in the current working directory) of the file to
    be opened or an integer file descriptor of the file to be
    wrapped. (If a file descriptor is given, it is closed when the
    returned I/O object is closed, unless closefd is set to False.)
    
    mode is an optional string that specifies the mode in which the file
    is opened. It defaults to 'r' which means open for reading in text
    mode.  Other common values are 'w' for writing (truncating the file if
    it already exists), 'x' for creating and writing to a new file, and
    'a' for appending (which on some Unix systems, means that all writes
    append to the end of the file regardless of the current seek position).
    In text mode, if encoding is not specified the encoding used is platform
    dependent: locale.getpreferredencoding(False) is called to get the
    current locale encoding. (For reading and writing raw bytes use binary
    mode and leave encoding unspecified.) The available modes are:
    
    ========= ===============================================================
    Character Meaning                    
    --------- ---------------------------------------------------------------
    'r'       open for reading (default)
    'w'       open for writing, truncating the file first
    'x'       create a new file and open it for writing
    'a'       open for writing, appending to the end of the file if it exists
    'b'       binary mode
    't'       text mode (default)
    '+'       open a disk file for updating (reading and writing)
    'U'       universal newline mode (deprecated)
    ========= 
===============================================================
    
    The default mode is 'rt' (open for reading text). For binary random
    access, the mode 'w+b' opens and truncates the file to 0 bytes, while
    'r+b' opens the file without truncation. The 'x' mode implies 'w' and
    raises an `FileExistsError` if the file already exists.
    
    Python distinguishes between files opened in binary and text modes,
    even when the underlying operating system doesn't. Files opened in
    binary mode (appending 'b' to the mode argument) return contents as
    bytes objects without any decoding. In text mode (the default, or when
    't' is appended to the mode argument), the contents of the file are
    returned as strings, the bytes having been first decoded using a
    platform-dependent encoding or using the specified encoding if given.
    
    'U' mode is deprecated and will raise an exception in future versions
    of Python.  It has no effect in Python 3.  Use newline to control
    universal newlines mode.
    
    buffering is an optional integer used to set the buffering policy.
    Pass 0 to switch buffering off (only allowed in binary mode), 1 to select
    line buffering (only usable in text mode), and an integer > 1 to indicate
    the size of a fixed-size chunk buffer.  When no buffering argument is
    given, the default buffering policy works as follows:
    
    * Binary files are buffered in fixed-size chunks; the size of the buffer
      is chosen using a heuristic trying to determine the underlying device's
      "block size" and falling back on `io.DEFAULT_BUFFER_SIZE`.
      On many systems, the buffer will typically be 4096 or 8192 bytes long.
    
    * "Interactive" text files (files for which isatty() returns True)
      use line buffering.  Other text files use the policy described above
      for binary files.
    
    encoding is the name of the encoding used to decode or encode the
    file. This should only be used in text mode. The default encoding is
    platform dependent, but any encoding supported by Python can be
    passed.  See the codecs module for the list of supported encodings.
    
    errors is an optional string that specifies how encoding errors are to
    be handled---this argument should not be used in binary mode. Pass
    'strict' to raise a ValueError exception if there is an encoding error
    (the default of None has the same effect), or pass 'ignore' to ignore
    errors. (Note that ignoring encoding errors can lead to data loss.)
    See the documentation for codecs.register or run 'help(codecs.Codec)'
    for a list of the permitted encoding error strings.
    
    newline controls how universal newlines works (it only applies to text
    mode). It can be None, '', '\n', '\r', and '\r\n'.  It works as
    follows:
    
    * On input, if newline is None, universal newlines mode is
      enabled. Lines in the input can end in '\n', '\r', or '\r\n', and
      these are translated into '\n' before being returned to the
      caller. If it is '', universal newline mode is enabled, but line
      endings are returned to the caller untranslated. If it has any of
      the other legal values, input lines are only terminated by the given
      string, and the line ending is returned to the caller untranslated.
    
    * On output, if newline is None, any '\n' characters written are
      translated to the system default line separator, os.linesep. If
      newline is '' or '\n', no translation takes place. If newline is any
      of the other legal values, any '\n' characters written are translated
      to the given string.
    
    If closefd is False, the underlying file descriptor will be kept open
    when the file is closed. This does not work when a file name is given
    and must be True in that case.
    
    A custom opener can be used by passing a callable as *opener*. The
    underlying file descriptor for the file object is then obtained by
    calling *opener* with (*file*, *flags*). *opener* must return an open
    file descriptor (passing os.open as *opener* results in functionality
    similar to passing None).
    
    open() returns a file object whose type depends on the mode, and
    through which the standard file operations such as reading and writing
    are performed. When open() is used to open a file in a text mode ('w',
    'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open
    a file in a binary mode, the returned class varies: in read binary
    mode, it returns a BufferedReader; in write binary and append binary
    modes, it returns a BufferedWriter, and in read/write mode, it returns
    a BufferedRandom.
    
    It is also possible to use a string or bytearray as a file for both
    reading and writing. For strings StringIO can be used like a file
    opened in a text mode, and for bytes a BytesIO can be used like a file
    opened in a binary mode.
    """
    pass

閱讀源碼可以看出除了file參數(shù)其他參數(shù)都為缺省推励,其中mode是一個可選字符串鹤耍,指定文件打開模式。它默認為“r”验辞,這意味著文本閱模式稿黄。其他參數(shù)沒有去深究,暫時沒有用到跌造。我們常用用的就是"file"抛猖、"mode"參數(shù),file為文件路徑這個不多講鼻听,重點說一下mode财著,因為筆者剛開始學(xué)習(xí)python對with open()文件操作一知半解,百度很多次沒有找到自己想要的解決方案撑碴,于是去閱讀python源碼撑教。

===============================================================
Character Meaning 文字意義
--------- ---------------------------------------------------------------
'r' open for reading (default) 打開讀取(默認)
'w' open for writing, truncating the file first打開進行寫入醉拓,首先截斷文件
'x' create a new file and open it for writing創(chuàng)建一個新文件并打開它進行寫入
'a' open for writing, appending to the end of the file if it exists打開寫入伟姐,如果文件存在,則追加到文件的末尾
'b' binary mode二進制模式
't' text mode (default)文本模式(默認)
'+' open a disk file for updating (reading and writing)打開磁盤文件進行更新(讀寫)
'U' universal newline mode (deprecated)通用換行模式(已棄用)
=========

以上的mode參數(shù)都是可以自由組合亿卤,這一點在源碼的描述中有

幾種模式簡要說明:
模式 文件不存在 是否覆蓋
r 讀取報錯 ——
r+ 可讀可寫 ——
w 寫入報錯 ——
ab 創(chuàng)建 不覆蓋愤兵,追加到文本末尾
wb 創(chuàng)建 覆蓋原文本
a 創(chuàng)建 不覆蓋,追加到文本末尾

再此記錄一下如果使用pickle.dump()模塊序列化對象時候排吴,with open()中的mode的參數(shù)一定要使用含b的組合模式秆乳,使用二進制模式操作文本寫入。如不使用二進制寫入則會報出一下錯誤钻哩。

pickle.dump()報錯信息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屹堰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子街氢,更是在濱河造成了極大的恐慌扯键,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珊肃,死亡現(xiàn)場離奇詭異荣刑,居然都是意外死亡,警方通過查閱死者的電腦和手機伦乔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門厉亏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人评矩,你說我怎么就攤上這事叶堆≮迤” “怎么了斥杜?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵虱颗,是天一觀的道長。 經(jīng)常有香客問我蔗喂,道長忘渔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任缰儿,我火速辦了婚禮畦粮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乖阵。我一直安慰自己宣赔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布瞪浸。 她就那樣靜靜地躺著儒将,像睡著了一般。 火紅的嫁衣襯著肌膚如雪对蒲。 梳的紋絲不亂的頭發(fā)上钩蚊,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音蹈矮,去河邊找鬼砰逻。 笑死,一個胖子當(dāng)著我的面吹牛泛鸟,可吹牛的內(nèi)容都是我干的蝠咆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼北滥,長吁一口氣:“原來是場噩夢啊……” “哼勺美!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碑韵,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤赡茸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后祝闻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體占卧,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年联喘,在試婚紗的時候發(fā)現(xiàn)自己被綠了华蜒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡豁遭,死狀恐怖叭喜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蓖谢,我是刑警寧澤捂蕴,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布譬涡,位于F島的核電站,受9級特大地震影響啥辨,放射性物質(zhì)發(fā)生泄漏涡匀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一溉知、第九天 我趴在偏房一處隱蔽的房頂上張望陨瘩。 院中可真熱鬧,春花似錦级乍、人聲如沸舌劳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒿囤。三九已至,卻和暖如春崇决,著一層夾襖步出監(jiān)牢的瞬間材诽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工恒傻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脸侥,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓盈厘,卻偏偏與公主長得像睁枕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沸手,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容