Python基础之:Python中的IO
文章目錄
- 簡介
- linux輸入輸出
- 格式化輸出
- f格式化
- format格式化
- repr和str
- %格式化方法
- 讀寫文件
- 文件對象的方法
- 使用json
簡介
IO就是輸入和輸出,任何一個程序如果和外部希望有交互的話,都需要使用到IO。相對于java而言,Python中的IO更加的簡單,易用。
本文將會詳細介紹Python中的IO操作。
linux輸入輸出
linux中有三種標準輸入輸出,分別是STDIN,STDOUT,STDERR,對應的數字是0,1,2。
STDIN是標準輸入,默認從鍵盤讀取信息;
STDOUT是標準輸出,默認將輸出結果輸出至終端;
STDERR是標準錯誤,默認將輸出結果輸出至終端。
我們常用的 2>&1,指將標準輸出、標準錯誤指定為同一輸出路徑 。
格式化輸出
python中,我們可以使用print方法來輸出信息。
我們看下print函數的定義:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)print函數將 objects 打印到 file 指定的文本流,以 sep 分隔并在末尾加上 end。 sep, end, file 和 flush 如果存在,那么必須以關鍵字參數的形式給出。
所有非關鍵字參數都會被轉換為字符串,并會被寫入到流,以 sep 分割,并在末尾加上 end。 sep 和 end 都必須為字符串;它們也可以為 None,這意味著使用默認值。 如果沒有給出 objects,則 print() 將只寫入 end。
file 參數必須是一個具有 write(string) 方法的對象;如果參數不存在或為 None,則將使用 sys.stdout。 由于要打印的參數會被轉換為文本字符串,因此 print()不能用于二進制模式的文件對象。 對于這些對象,可以使用 file.write(...)。
輸出是否被緩存通常決定于 file,但如果 flush 關鍵字參數為真值,輸出流會被強制刷新。
可以看到print的輸出格式還是比較簡單的。我們接下來看一下怎么豐富輸出的格式。
f格式化
如果想要格式化字符串,可以在字符串的開始引號之前加上 f 或 F。
這樣的話,我們可以直接在字符串中引入變量值,只需要把變量放在 { 和 } 中間即可。
>>> year = 2016 >>> event = 'Referendum' >>> f'Results of the {year} {event}' 'Results of the 2016 Referendum'除了在{ }中放入Python變量之外,還可以在其中放入函數:
>>> import math >>> print(f'The value of pi is approximately {math.pi:.3f}.') The value of pi is approximately 3.142.在 ':' 后傳遞一個整數可以讓該字段成為最小字符寬度。方便列對齊:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} >>> for name, phone in table.items(): ... print(f'{name:10} ==> {phone:10d}') ... Sjoerd ==> 4127 Jack ==> 4098 Dcab ==> 7678{ }中的變量后面還可以跟著轉值符號:'!a' 表示應用 ascii() ,'!s' 表示應用 str(),還有 '!r' 表示應用 repr():
>>> animals = 'eels' >>> print(f'My hovercraft is full of {animals}.') My hovercraft is full of eels. >>> print(f'My hovercraft is full of {animals!r}.') My hovercraft is full of 'eels'.format格式化
除此之外,str本身自帶一個功能強大的format 函數:
str.format(*args, **kwargs)調用此方法的字符串可以包含字符串字面值或者以花括號 {} 括起來的替換域,每個替換域可以包含一個位置參數的數字索引,或者一個關鍵字參數的名稱。 返回的字符串副本中每個替換域都會被替換為對應參數的字符串值。
>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3'再看一個使用索引的例子:
>>> print('{0} and {1}'.format('spam', 'eggs')) spam and eggs >>> print('{1} and {0}'.format('spam', 'eggs')) eggs and spam看一個關鍵字的例子:
>>> print('This {food} is {adjective}.'.format( ... food='spam', adjective='absolutely horrible')) This spam is absolutely horrible.再看一個組合的例子:
>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',other='Georg')) The story of Bill, Manfred, and Georg.還有非常復雜的組合的例子:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; ' ... 'Dcab: {0[Dcab]:d}'.format(table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678或者使用 ‘**’ 符號將 table 作為關鍵字參數傳遞:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678還可以使用n類型 '{:n}' 來格式化數字:
>>> yes_votes = 42_572_654 >>> no_votes = 43_132_495 >>> percentage = yes_votes / (yes_votes + no_votes) >>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage) ' 42572654 YES votes 49.67%'repr和str
如果我們只是想要將Python對象轉換為字符串,那么可以使用repr()或者str(), str() 函數是用于返回人類可讀的值的表示,而 repr()是用于生成解釋器可讀的表示。
舉個例子:
>>> s = 'Hello, world.' >>> str(s) 'Hello, world.' >>> repr(s) "'Hello, world.'" >>> str(1/7) '0.14285714285714285' >>> x = 10 * 3.25 >>> y = 200 * 200 >>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' >>> print(s) The value of x is 32.5, and y is 40000... >>> # The repr() of a string adds string quotes and backslashes: ... hello = 'hello, world\n' >>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' >>> # The argument to repr() may be any Python object: ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))"str對象還提供了一些對字符串進行手動格式化的方法:
>>> for x in range(1, 11): ... print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ') ... # Note use of 'end' on previous line ... print(repr(x*x*x).rjust(4)) ...1 1 12 4 83 9 274 16 645 25 1256 36 2167 49 3438 64 5129 81 729 10 100 1000字符串對象的 str.rjust()方法通過在左側填充空格來對給定寬度的字段中的字符串進行右對齊。類似的方法還有 str.ljust()和 str.center()。
如果輸入的字符串太長,它們不會截斷字符串,而是原樣返回。
如果想保證字符串的長度,則可以使用切片: x.ljust(n)[:n] 。
還可以使用str.zfill()來用0填充字符串:
>>> '12'.zfill(5) '00012' >>> '-3.14'.zfill(7) '-003.14' >>> '3.14159265359'.zfill(5) '3.14159265359'%格式化方法
% 也可以用來格式化字符串,給定 'string' % values,則 string 中的 % 實例會以零個或多個 values 元素替換。 此操作通常被稱為字符串插值。
>>> import math >>> print('The value of pi is approximately %5.3f.' % math.pi) The value of pi is approximately 3.142.讀寫文件
python中文件讀取非常簡單,使用open()方法即可。
open()會返回一個文件對象。我們看一下它的定義:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)第一個參數是文件名。
第二個參數是文件打開的模式,可用的模式有:
| 'r' | 讀取(默認) |
| 'w' | 寫入,并先截斷文件 |
| 'x' | 排它性創建,如果文件已存在則失敗 |
| 'a' | 寫入,如果文件存在則在末尾追加 |
| 'b' | 二進制模式 |
| 't' | 文本模式(默認) |
| '+' | 打開用于更新(讀取與寫入) |
默認模式為 'r' 。
看一個open文件的例子:
>>> f = open('workfile', 'w')文件打開了,自然需要被關閉,所以我們需要顯示調用 f.close() 方法:
>>> f.close()有沒有類似java中的try with resource的自動關閉文件的功能呢?
我們可以使用with,這樣文件在使用完畢之后,會自動被關閉,非常的好用。
>>> with open('workfile') as f: ... read_data = f.read()>>> # We can check that the file has been automatically closed. >>> f.closed True文件被關閉之后,如果想要再次讀取,就會報錯:
>>> f.close() >>> f.read() Traceback (most recent call last):File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file.文件對象的方法
獲取到文件對象之后,我們就可以調用文件中的方法了。
f.read(size) 會讀取一些數據并將其作為字符串(在文本模式下)或字節串對象(在二進制模式下)返回。
size 是一個可選的數值參數。 當 size 被省略或者為負數時,將讀取并返回整個文件的內容;當取其他值時,將讀取并返回至多 size 個字符(在文本模式下)或 size 個字節(在二進制模式下)。 如果已到達文件末尾,f.read() 將返回一個空字符串 ('')。
>>> f.read() 'This is the entire file.\n' >>> f.read() ''f.readline() 從文件中讀取一行;換行符(\n)留在字符串的末尾,如果文件不以換行符結尾,則在文件的最后一行省略。如果 f.readline() 返回一個空的字符串,則表示已經到達了文件末尾,而空行使用 '\n' 表示,該字符串只包含一個換行符。
>>> f.readline() 'This is the first line of the file.\n' >>> f.readline() 'Second line of the file\n' >>> f.readline() ''還有一種更加簡單的讀取方法,就是從文件中遍歷:
>>> for line in f: ... print(line, end='') ... This is the first line of the file. Second line of the file如果你想以列表的形式讀取文件中的所有行,你也可以使用 list(f) 或 f.readlines()。
f.write(string) 會把 string 的內容寫入到文件中,并返回寫入的字符數。
>>> f.write('This is a test\n') 15如果是在文本模式下,那么在寫入文件之前,需要把對象轉換成為文本形式,我們可以使用str()來進行轉換。
>>> value = ('the answer', 42) >>> s = str(value) # convert the tuple to string >>> f.write(s) 18使用f.seek(offset, whence)可以定位文件指針的位置,然后后續會從該位置開始進行讀取操作。
whence 的 0 值表示從文件開頭起算,1 表示使用當前文件位置,2 表示使用文件末尾作為參考點。 whence 如果省略則默認值為 0,即使用文件開頭作為參考點。
>>> f = open('workfile', 'rb+') >>> f.write(b'0123456789abcdef') 16 >>> f.seek(5) # Go to the 6th byte in the file 5 >>> f.read(1) b'5' >>> f.seek(-3, 2) # Go to the 3rd byte before the end 13 >>> f.read(1) b'd'使用json
JSON是一個很方便進行信息交流的文件格式。我們看下怎么使用JSON來將對象轉換為字符串:
>>> import json >>> json.dumps([1, 'simple', 'list']) '[1, "simple", "list"]'dumps是將對象轉換為json str。 json還有一個dump方法,可以直接將對象存入到文件中。
json.dump(x, f)要從文件中解析出json字符串,可以使用load:
x = json.load(f)JSON 中的鍵-值對中的鍵永遠是 str類型的。當一個對象被轉化為 JSON 時,字典中所有的鍵都會被強制轉換為字符串。這所造成的結果是字典被轉換為 JSON 然后轉換回字典時可能和原來的不相等。換句話說,如果 x 具有非字符串的鍵,則有 loads(dumps(x)) != x。
本文已收錄于 http://www.flydean.com/08-python-io/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!
總結
以上是生活随笔為你收集整理的Python基础之:Python中的IO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础之:Python中的模块
- 下一篇: Python基础之:Python中的异常