文件IO

IO: input/outpython

本篇講的IO專指文件IObash

1、打開和關閉文件

In [1]: help(open)

Help on built-in function open in module io:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, clo
sefd=True, opener=None)
    Open file and return a stream.  Raise IOError 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.)
...
In [2]: f = open('./hello.py')

In [3]: f
Out[3]: <_io.TextIOWrapper name='./hello.py' mode='r' encoding='UTF-8'>

In [4]: f.read()
Out[4]: ''

In [5]: f.close()

In [6]: f.read()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-571e9fb02258> in <module>()
----> 1 f.read()

ValueError: I/O operation on closed file.

In [7]:

2、文件對象的操做

In [7]: f = open('./hello.py')  

In [8]: f.write('test')           # mode=r  默認權限:只讀
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-8-c2c133bc4fec> in <module>()
----> 1 f.write('test')

UnsupportedOperation: not writable

In [9]: f.close()
In [10]: f = open('./hello.py', mode='r')

In [11]: f.write('test')
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-11-c2c133bc4fec> in <module>()
----> 1 f.write('test')

UnsupportedOperation: not writable

In [12]: f.read()
Out[12]: ''

In [13]: f.close()

In [14]:
In [14]: f = open('./hello.py', mode='w')  # mode=w 文件不可讀;即便文件打開後不作任何操做,也會清空文件

In [15]: %cat hello.py

In [16]: f.read()
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-16-571e9fb02258> in <module>()
----> 1 f.read()

UnsupportedOperation: not readable         # mode=w 當文件不存在的時候,會建立該文件   

In [17]: f.write('aaaaa')
Out[17]: 5

In [18]: f.close()

In [19]: %cat hello.py
aaaaa
In [20]: f = open('./hello.py', mode='w')

In [21]: f.close()

In [22]: %cat hello.py

In [23]:
In [28]: f = open('./hello.py', mode='x')   # 當文件存在的時候, 會報錯
---------------------------------------------------------------------------
FileExistsError                           Traceback (most recent call last)
<ipython-input-28-d2f14f50d8d0> in <module>()
----> 1 f = open('./hello.py', mode='x')

FileExistsError: [Errno 17] File exists: './hello.py'

In [29]: %rm hello.py

In [30]: f = open('./hello.py', mode='x')   # 當文件存在的時候, 會報錯, 不可讀,可寫

In [31]: f.read()
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-31-571e9fb02258> in <module>()
----> 1 f.read()

UnsupportedOperation: not readable

In [32]: f.write('abcd')
Out[32]: 4

In [33]: f.close()

In [34]: %cat hello.py
abcd
In [35]:
In [40]: %rm hello.py

In [41]: f = open('./hello.py', mode='a')   # mode=a, 不可讀, 可寫;而且是追加寫 

In [42]: f.write('abcd')
Out[42]: 4

In [43]: f.read()
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-43-571e9fb02258> in <module>()
----> 1 f.read()

UnsupportedOperation: not readable

In [44]: f.close()

In [45]: %cat hello.py
abcd
In [46]:

總結:

從 控制讀寫的模式:

  • r 只讀,文件必須存在
  • w 只寫,清空文件,文件不存在會建立文件
  • x 只寫,文件必須不存在
  • a 只寫,追加到文件末尾,文件不存在會建立文件

從其餘方面來看:

  • 從讀寫方面來看,只有r 是 可讀不可寫的,其餘都是可寫不可讀
  • 從文件不存在來看,只有r 拋出異常,其餘都是建立新文件
  • 從文件存在來看,只有x 拋出異常
  • 從是否影響內容來看,只有w 會清空文件
In [46]: f = open('./hello.py', mode='rt')  # mode=t 是以文本方式打開文件

In [47]: s = f.read()

In [48]: s
Out[48]: 'abcd'

In [49]: f.close()

In [50]: f = open('./hello.py', mode='rb')  # mode=b 是以字節方式打開文件

In [51]: s = f.read()

In [52]: s
Out[52]: b'abcd'

In [53]: f.close()

In [54]:
  • mode=t  按字符操做
  • mode=b 按字節操做
In [55]: f = open('./hello.py', mode='r+')  # mode=r+  可讀可寫,而且是一個追加寫

In [56]: f.read()
Out[56]: 'abcd'

In [57]: f.write('efgh')
Out[57]: 4

In [58]: f.read()
Out[58]: ''

In [59]: f.close()

In [60]: %cat hello.py
abcdefgh
In [61]:
In [62]: f = open('./hello.py', mode='w+')    # mode=w+ 可讀可寫, 同時會清空文件

In [63]: f.read()
Out[63]: ''

In [64]: f.write('馬哥教育')
Out[64]: 4

In [65]: f.close()

In [66]: %cat hello.py
馬哥教育
In [67]:
  • 因爲 w+ 會先清空文件,因此通常打開文件都會使用 r+
  • rwxa 模式有且僅有一種,存在於場上;而且 + 不能單獨使用
     

3、文件指針

In [67]: help(f.tell)

Help on built-in function tell:

tell() method of _io.TextIOWrapper instance
    Return current stream position.
~   # 返回當前流的位置

(END)
In [69]: f = open('./hello.py')             # mode=rt   

In [70]: f.tell()
Out[70]: 0

In [71]: f.read()
Out[71]: '馬哥教育'

In [72]: f.tell()
Out[72]: 12

In [73]: f.close()

In [74]: f = open('./hello.py', mode='a')   

In [75]: f.tell()
Out[75]: 12

In [76]: f.close()

In [77]:
In [78]: f = open('./hello.py')

In [79]: help(f.seek)

Help on built-in function seek:

seek(cookie, whence=0, /) method of _io.TextIOWrapper instance
    Change stream position.
    
    Change the stream position to the given byte offset. The offset is
    interpreted relative to the position indicated by whence.  Values
    for whence are:
                                          # 偏移量應當爲0 或正整數  
    * 0 -- start of stream (the default); offset should be zero or positive 
    * 1 -- current stream position; offset may be negative  # 偏移量能夠爲0或負整數
    * 2 -- end of stream; offset is usually negative  # 偏移量 一般爲 負整數
    
    Return the new absolute position.
    # 返回新的絕對位置
~
(END)

In [91]: f = open('./hello.py', 'w+')

In [92]: f.write('magedu')
Out[92]: 6

In [93]: f.close()

In [94]: %cat hello.py
magedu
In [95]: f = open('./hello.py')

In [96]: f.tell()
Out[96]: 0

In [97]: f.read()
Out[97]: 'magedu'

In [98]: f.tell()
Out[98]: 6

In [99]: f.seek(0, 0)
Out[99]: 0

In [100]: f.tell()
Out[100]: 0

In [101]: f.read()
Out[101]: 'magedu'

In [102]: f.seek(2, 0)
Out[102]: 2

In [103]: f.tell()
Out[103]: 2

In [104]: f.read()
Out[104]: 'gedu'

In [105]: f.seek(0, 0)
Out[105]: 0

In [106]: f.read()
Out[106]: 'magedu'

In [107]: f.seek(4, 1)
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-107-d74820aa25fe> in <module>()
----> 1 f.seek(4, 1)

UnsupportedOperation: can't do nonzero cur-relative seeks

In [108]: f.seek(0, 1)
Out[108]: 6

In [109]: f.seek(0, 2)
Out[109]: 6

In [110]: f.tell()
Out[110]: 6

In [111]: f.close()

In [112]:

總結:

mode=t

  • 按字節移動文件指針
  • 當whence (第二個參數)位 start(0) (默認值) , 能夠移動任意位置,offset 能夠是任意整數,(offset 就是他的第一個參數)
  • 當whence 位current 也就是1,或者是end 也就是2的時候,offset 只能爲0
In [113]: f = open('./hello.py', mode='w')

In [114]: f.write('馬哥教育')
Out[114]: 4

In [115]: f.close()

In [116]: f = open('./hello.py', mode='rb')

In [117]: f.tell()
Out[117]: 0

In [118]: f.seek(3)
Out[118]: 3

In [119]: f.read()
Out[119]: b'\xe5\x93\xa5\xe6\x95\x99\xe8\x82\xb2'

In [120]: f.seek(3)
Out[120]: 3

In [121]: f.read().decode()
Out[121]: '哥教育'

In [122]: f.seek(3)
Out[122]: 3

In [123]: f.seek(3, 1)
Out[123]: 6

In [124]: f.seek(3, 2)
Out[124]: 15

In [125]: f.read()
Out[125]: b''

In [126]: f.read().decode()
Out[126]: ''

In [127]: f.seek(-3, 2)
Out[127]: 9

In [128]: f.read().decode()
Out[128]: '育'

In [129]: f.seek(13)
Out[129]: 13

In [130]: f.seek(-13, 2)
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-130-6a41921c313a> in <module>()
----> 1 f.seek(-13, 2)

OSError: [Errno 22] Invalid argument

In [131]:

總結:

mode=b

  • 按字節移動指針
  • 當whence start(0), 能夠移動任意位置,offset 能夠是任意整數
  • 當whence 位 爲 current 也就是1,end 也就是2的時候,也能夠是任意整數

移動文件指針:

  • 文件指針按字節操做
  • tell 方法返回當前文件指針位置
  • seek 方法移動文件指針
  • whence 參數start(0), current(1), end(2) 事實上,這些變量有咱們的常量 SEEK_SET(0), SEEK_CUR(1), SEEK_END(2)
    • SEEK_SET(0) 從0開始向後移動offset 個字節
    • SEEK_CUR(1) 從當前位置向後移動offset個字節
    • SEEK_END(2) 從EOF向後移動offset個字節  EOF:END OF FILE
  • offset 是整數
  • 當mode 爲t 時,whence 爲SEEK_CUR 或者SEEK_END ,offset 只能爲0
  • 文件指針不能爲負數
  • 讀文件的時候,從文件指針開始向後讀
  • 寫文件的時候,從min(EOF)處 開始向後寫
  • 當以mode 爲a 模式打開的時候,不管文件指針在何處,都從EOF開始寫

一、落盤操做(flush)

In [132]: f = open('./hello.py', 'wb')

In [133]: f.write(b'abc')
Out[133]: 3

In [134]: %cat hello.py

In [135]: f.flush()          # 落盤

In [136]: %cat hello.py
abc
In [137]: f.write(b'apapapa')
Out[137]: 7

In [138]: %cat hello.py
abc
In [139]: f.close()          # 自帶 flush

In [140]: %cat hello.py
abcapapapa
In [141]:

二、buffering(緩衝區)

In [145]: f = open('./hello.py', 'wb', buffering=5)

In [146]: f.write(b'abc')
Out[146]: 3

In [147]: %cat hello.py

In [148]: f.write(b'abc')
Out[148]: 3

In [149]: %cat hello.py
abc
In [150]: f.close()

In [151]: %cat hello.py
abcabc
In [152]: f = open('./hello.py', 'wb', buffering=5)

In [153]: f.write(b'a')
Out[153]: 1

In [154]: f.write(b'b')
Out[154]: 1

In [155]: f.write(b'q')
Out[155]: 1

In [156]: f.write(b'ab')
Out[156]: 2

In [157]: f.write(b'1')
Out[157]: 1

In [158]: %cat hello.py
abqab
In [159]: f.close()

In [160]:
In [161]: f = open('./hello.py', 'wb', buffering=0)

In [162]: f.write(b'a')
Out[162]: 1

In [163]: %cat hello.py
a
In [164]: f.write(b'b')
Out[164]: 1

In [165]: %cat hello.py
ab
In [166]: f.close()

In [167]: f = open('./hello.py', 'wb', buffering=0)

In [168]: f.write(b'abcdefg')
Out[168]: 7

In [169]: %cat hello.py
abcdefg
In [170]:
In [170]: import io

In [171]: io.DEFAULT_BUFFER_SIZE
Out[171]: 8192

In [172]: f = open('./hello.py', 'wt', buffering=1)   # 只有當buffering=1 的時候,纔是 line buffer

In [173]: f.write('abc')
Out[173]: 3

In [174]: %cat hello.py

In [175]: f.write('\n')
Out[175]: 1

In [176]: %cat hello.py
abc

In [177]: f.close()
In [185]: f = open('./hello.py', 'wt', buffering=5)

In [186]: f.write('abc')
Out[186]: 3

In [187]: %cat hello.py

In [188]: f.write('\n')
Out[188]: 1

In [189]: %cat hello.py

In [190]: f.write('a' * io.DEFAULT_BUFFER_SIZE)
Out[190]: 8192

In [191]: f.close()

In [192]: f = open('./hello.py', 'wt', buffering=5)

In [193]: f.write('a' * io.DEFAULT_BUFFER_SIZE)
Out[193]: 8192

In [194]: %cat hello.py

In [195]: f.write('b')
Out[195]: 1

In [196]: %cat hello.py
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
In [197]: f.close()

In [198]:

buffering>1 的時候, 緩衝區的大小爲 io.DEFAULT_BUFFER_SIZE; 當緩衝區滿時,flush緩衝區連同本次寫入的內容一塊兒 落盤。

總結:

  • buffering = -1
    • 二進制模式:io.DEFAULT_BUFFER_SIZE
    • 文本模式:io.DEFAULT_BUFFER_SIZE
  • buffering = 0
    • 二進制模式:關閉buffering 也就是unbuffered
    • 文本模式:不容許
  • buffering = 1
    • 二進制模式:1
    • 文本模式: line buffer
  • buffering > 1
    • 二進制模式:buffering
    • 文本模式:io.DEFAULT_BUFFER_SIZE
    • 二進制模式:判斷緩衝區的位置是否足夠存放當前字節,若是不能,先flush,再把當前字節寫入緩衝區,若是當前字節大於緩衝區大小,直接flush
    • 文本模式:line buffering,遇到換行就flush;非line buffering,當前字節加緩衝區中的字節超出緩衝區大小,直接flush 緩衝區和當前字節

flush 和 close 方法能夠強制刷新緩衝區cookie

 

In [217]: f = open('hello.py', 'w+', buffering=1)

In [218]: f.write('abcd')
Out[218]: 4

In [219]: f.read()
Out[219]: ''

In [220]: f.seek(0)
Out[220]: 0

In [221]: f.tell()
Out[221]: 0

In [222]: f.read()
Out[222]: 'abcd'

In [223]: f.close()
  • readline 方法
In [242]: f = open('hello.py', 'w+', buffering=1)

In [243]: f.write('abc')
Out[243]: 3

In [244]: f = open('hello.py', 'r+')

In [245]: f.write('1234\n')
Out[245]: 5

In [246]: f.write('hjhk\n')
Out[246]: 5

In [247]: f.write('op976\n')
Out[247]: 6

In [248]: f.seek(0)
Out[248]: 0

In [249]: f.read(4)       # 跟着指針走
Out[249]: '1234'

In [250]: f.read(4)
Out[250]: '\nhjh'

In [251]: f.read(-1)
Out[251]: 'k\nop976\n'

In [252]: f.seek(0)
Out[252]: 0

In [253]: f.read(0)
Out[253]: ''

In [254]: f.readline()
Out[254]: '1234\n'

In [255]: help(f.readline)

Help on built-in function readline:

readline(size=-1, /) method of _io.TextIOWrapper instance
    Read until newline or EOF.
    
    Returns an empty string if EOF is hit immediately.
~

(END)
In [256]: f.seek(0)
Out[256]: 0

In [257]: f.readline(2)
Out[257]: '12'

In [258]: f.readlines()
Out[258]: ['34\n', 'hjhk\n', 'op976\n']

In [259]: f.seek(0)
Out[259]: 0

In [260]: for line in f:
     ...:     print(line)
     ...:     
1234

hjhk

op976


In [261]: f.writable()
Out[261]: True

In [262]: f.write('bnm\n')
Out[262]: 4

In [263]: f.writelines(['bnm\n', '098765fgh\n'])

In [264]: f.flush()

In [265]: %cat hello.py
1234
hjhk
op976
bnm
bnm
098765fgh

In [266]: f.seekable()
Out[266]: True

In [267]:

二、sys 模塊

In [272]: import sys

In [273]: sys.stderr.seekable()     # 進行指針測試
Out[273]: False

In [274]: f.fileno()                # 若是 f 含有文件描述符則返回;若是 f 沒有使用文件描述符,則返回osError 
Out[274]: 12

In [275]: f.isatty()                # 返回這是不是一個「交互」流 ;若是不能肯定,則返回 false
Out[275]: False

In [276]: f.name                    # 返回 f 的名字 
Out[276]: 'hello.py'

In [277]: f.buffer                  # 返回緩衝區 信息?
Out[277]: <_io.BufferedRandom name='hello.py'>

In [278]: f.truncate()    # 文件指針保持不變。大小默認爲當前IO ;根據據tell()位置,返回新的大小。
Out[278]: 34

In [279]: f.close()
In [322]: f = open('hello.py', 'r+b')

In [323]: f1 = open('test.txt', 'r+b')

In [324]: f1.write(b'lkjhgfdsajytr')
Out[324]: 13

In [325]: f1.close()

In [326]: f.seek(0)
Out[326]: 0

In [327]: f.readinto(f1)    # readinto(緩衝,/)_io.bufferedrandom的實例方法
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-327-d3164cf92344> in <module>()
----> 1 f.readinto(f1)

TypeError: readinto() argument must be read-write bytes-like object, not _io.BufferedRandom
# TypeError:readinto()參數必須是可讀寫的, 字節的形式的對象,不可以是_io.bufferedrandom
In [328]: 

In [328]: f.close()

In [329]: f1.close()

In [330]: f1 = open('test.txt', 'r+b')

In [331]: f = open('hello.py', 'r+b')

In [332]: buffer = bytearray()

In [333]: f.readinto(buffer)
Out[333]: 0

In [334]: f.close()

In [335]: f1.close()

In [336]:
相關文章
相關標籤/搜索