1. 程式人生 > >Python3 輸入和輸出

Python3 輸入和輸出

open python pickle 輸入輸出

Edit


筆記內容:Python3 輸入和輸出
筆記日期:2017-11-05


  • 輸出格式美化

  • 舊式字符串格式化

  • 讀取鍵盤輸入

  • 讀和寫文件

  • 文件對象的方法

  • pickle 模塊

Python3 輸入和輸出

輸出格式美化

Python有兩種較為常用的輸出方式::表達式語句和 print() 函數。
第三種方式則是使用文件對象的 write() 方法,標準輸出文件可以使用sys.stdout 。
如果你希望輸出的形式更加多樣,可以使用 str.format() 函數來格式化輸出值。
如果你希望將輸出的值轉成字符串,可以使用 repr() 或 str() 函數來實現。

  • str(): 函數返回一個用戶易讀的表達形式。

  • repr(): 產生一個解釋器易讀的表達形式。

    例如:

>>> s = ‘Hello‘
>>> str(s)   # 返回一個用戶易讀的表達形式
‘Hello‘
>>> repr(s)  # 產生一個解釋器易讀的表達形式
"‘Hello‘"
>>> str(1/7)
‘0.14285714285714285‘
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = ‘x 的值為: ‘ + repr(x) + ‘,  y 的值為:‘ + repr(y) + ‘...‘
>>> print(s)
x 的值為: 32.5,  y 的值為:40000...
>>> #  repr() 函數可以轉義字符串中的特殊字符
... hello = ‘hello\n‘
>>> hello2 = repr(hello)
>>> print(hello2)
‘hello\n‘
>>> # repr() 的參數可以是 Python 的任何對象
... repr((x, y, (‘Google‘, ‘Baidu‘)))
"(32.5, 40000, (‘Google‘, ‘Baidu‘))"

str.format() 的基本使用如下:

>>> print(‘{}網址:"{}!"‘.format(‘zero‘,‘www.zero01.org‘))  # 一個大括號對應一個字符串
zero網址:"www.zero01.org!"

大括號及其裏面的字符 (稱作格式化字段) 將會被 format() 中的參數替換。
在括號中的數字用於指向傳入對象在 format() 中的位置,如下所示:

>>> print(‘{0} 和 {1} 不是好朋友‘.format(‘小明‘, ‘小紅‘))
小明 和 小紅 不是好朋友
>>> print(‘{1} 和 {0} 不是好朋友‘.format(‘小明‘, ‘小紅‘))
小紅 和 小明 不是好朋友

如果在 format() 中使用了關鍵字參數, 那麽它們的值會指向使用該名字的參數。

>>> print(‘{name}網址:"{host}!"‘.format(name=‘zero‘,host=‘www.zero01.org‘))
zero網址:"www.zero01.org!"

可以將以上兩種使用方法結合一起使用:

# 索引要使用在參數的前面
>>> print(‘{0}{name}網址:"{host}"!‘.format(‘Test:‘,name=‘zero‘,host=‘www.zero01.org‘))
Test:zero網址:"www.zero01.org"!

使用以下幾個字符可以在格式化某個值之前對其進行轉化:

  • !a 等於調用了 ascii( ) 函數進行轉化

  • !s 等於調用了 str( ) 函數進行轉化

  • !r 等於調用了 repr( ) 函數進行轉化

代碼示例:

print(‘{!a}‘.format(‘hello‘))
print(‘{!s}‘.format(‘hello‘))
print(‘{!r}‘.format(‘hello‘))

運行結果:

‘hello’
hello
‘hello’

如果我們要保留n位小數時,可以使用冒號 ’ : ’ 來進行指定保留幾位小數,例如下面的示例將 Pi 保留三位小數:

import math

# f的作用是表示這個是個浮點數類型
print(‘保留三位小數的PI:{0:.3f}‘.format(math.pi))

運行結果:

保留三位小數的PI:3.142

在 ‘:’ 後傳入一個整數, 可以保證該域至少有這麽多的寬度。 用於美化表格時很有用。

>>> table = {‘Google‘: 1, ‘Runoob‘: 2, ‘Taobao‘: 3}
>>> for name, number in table.items():
...     print(‘{0:10} ==> {1:10d}‘.format(name, number))
...
Runoob     ==>          2
Taobao     ==>          3
Google     ==>          1

如果你有一個很長的格式化字符串, 而你不想將它們分開, 那麽在格式化時通過變量名而非位置會是很好的事情。
最簡單的就是傳入一個字典, 然後使用方括號 ‘[]’ 來訪問鍵值 :

>>> table = {‘Google‘: 1, ‘Runoob‘: 2, ‘Taobao‘: 3}
# d是用來接收整型數值的
>>> print(‘Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}‘.format(table))
Runoob: 2; Google: 1; Taobao: 3


舊式字符串格式化

% 操作符也可以實現字符串格式化。 它將左邊的參數作為類似 sprintf() 式的格式化字符串, 而將右邊的代入, 然後返回格式化後的字符串. 例如:

>>> import math
>>> print(‘常量 PI 的值近似為:%5.3f。‘ % math.pi)
常量 PI 的值近似為:3.142。

因為 str.format() 比較新的函數, 大多數的 Python 代碼仍然使用 % 操作符。但是因為這種舊式的格式化最終會從該語言中移除, 應該更多的使用 str.format(),所以了解一下即可。


讀取鍵盤輸入

Python提供了一個內置函數 input() ,可以從標準輸入讀入一行文本,默認的標準輸入是鍵盤,在PyCharm工具中使用這個函數就可以允許你從控制臺中進行輸入。
input 可以接收一個Python表達式作為輸入,並將運算結果返回。

str = input("請輸入:")
print ("你輸入的內容是: ", str)

這會產生如下的對應著輸入的結果:

請輸入:hello
你輸入的內容是: hello

如果你要通過鍵盤的輸入進行一個運算的話,需要把類型轉換成數字類型,例如:

num=int(input("請輸入:"))
print("輸入的數字平方是:",num*num)

運行結果:

請輸入:3
輸入的數字平方是: 9

如果不轉類型的話,會按照字符串類型去進行運算,所以結果當然是錯誤的,錯誤示例:

num=input("請輸入:")
print("輸入的數字乘以二是:",num*2)

運行結果:

請輸入:3
輸入的數字乘以二是: 33


讀和寫文件

在python中有一個內置的 open( ) 函數,這個函數可以用於打開某個文件進行讀寫操作,此函數會返回一個file對象,基本語法格式如下:

open(filename, mode)

  • filename 變量用於表示你要訪問的文件路徑。

  • mode則決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,如果提供參數的話,默認的文件訪問模式為只讀(r)。

不同模式打開文件的完全列表:

技術分享

以下使用一個示例,演示將一段文字寫入到一個文件中:

# 打開一個文件,並指定訪問模式為寫
output=open("E:/test.txt","w")

# 往這個文件寫入一段文字,換行使用\n來換行
output.write("Python 是一個非常好的語言。\n是的,人生苦短我用python!!\n")

# 關閉打開的文件,不然會導致資源占用
output.close()
  • 第一個參數為要打開的文件名。

  • 第二個參數描述文件如何使用的字符。 mode 可以是 ‘r’ 如果文件只讀, ‘w’ 只用於寫 (如果存在同名文件則將被刪除), 和 ‘a’ 用於追加文件內容; 所寫的任何數據都會被自動增加到末尾. ‘r+’ 同時用於讀寫。 mode 參數是可選的; ‘r’ 將是默認值。

運行結果:

技術分享

打開此文件可以看到我們寫入的內容。

以下再使用一個示例,讀取我們剛剛寫入的那個文件中的內容:

file_str=open("E:/test.txt")  # 參數為這個文件的路徑

print(file_str.readline()) # 使用此方法可以讀取一行文字,返回值是一個字符串
print(file_str.readline())

file_str.close()

運行結果:

Python 是一個非常好的語言。

是的,人生苦短我用python!!


文件對象的方法

上面已經介紹過兩個文件對象的方法了,這兩個方法也是最主要的方法,一個用於寫文件一個用於讀文件。除了這兩個方法還有以下幾個方法:

  • read( size ) 此方法有一個默認參數,這個參數用於定義這個方法一次讀取多少數據,單位是字節。然後讀取的結果會作為字符串或字節對象返回。
    因為size 是一個可選的數字類型的參數,所以當 size 被忽略了或者為負, 那麽該文件的所有內容都將被讀取並且返回。

代碼示例:

file_str=open("E:/test.txt")

str=file_str.read(10)
print(str)

file_str.close()

運行結果:

Python 是一個

因為設定只讀取10個字節,所以文件內容沒有被全部讀取出來。

如果想要讀取全部內容,就不需要指定這個參數:

file_str=open("E:/test.txt")

str=file_str.read()
print(str)

file_str.close()

運行結果:

Python 是一個非常好的語言。
是的,人生苦短我用python!!

  • readline( ) 這個方法上面的示例也使用過了,這個方法能按行讀取文件內容,換行符為’ \n ’ 。如果此方法返回了一個空字符串, 說明文件已經讀完了。

代碼示例:

file_str = open("E:/test.txt")

while True:
    str = file_str.readline()

    if str == "":
        print("文件已經讀取完了!")
        break

    print(str)

file_str.close()

運行結果:

Python 是一個非常好的語言。

是的,人生苦短我用python!!

文件已經讀取完了!

  • readlines( ) 此方法會以列表的形式返回文件中所有的行,此方法也有一個可選參數,此參數用於指定讀取的字節長度,並且會將這些字節按行分割。

代碼示例:

file_str = open("E:/test.txt")

print(type(file_str.readlines()))

file_str.close()

運行結果:

<class ‘list‘>

從結果可以看到返回的對象類型是list列表。


我們可以通過遍歷列表,來取出裏面的元素:
代碼示例:

file_str = open("E:/test.txt")

listfile=file_str.readlines()

print("獲得的是一個列表:",listfile,"\n")

print("可以使用循環將列表中的內容遍歷出來:")
for i in listfile:
    print(i)

file_str.close()

運行結果:

獲得的是一個列表: [‘Python 是一個非常好的語言。\n’, ‘是的,人生苦短我用python!!\n’]

可以使用循環將列表中的內容遍歷出來:
Python 是一個非常好的語言。

是的,人生苦短我用python!!

這個方法並不常用,畢竟用 readline( ) 方法就可以了。

  • write( ) 此方法在之前的示例也用到過,可以將一段字符串內容寫入到某個指定的文件中,如需換行得使用 \n 轉義符。但是如果想要將數字類型或者其他的非字符串類型寫入到文件中,需要提前轉換成字符串類型:

代碼示例:

file_str = open("E:/test.txt", "w")  # 設置為寫模式

data = ["TestNumber:", 123, 45, 12.5]
outData = str(data)  # 轉換成字符串類型
file_str.write(outData)  # 寫入到文件中

file_str.close()  # 記得一定要關閉資源

運行結果:

技術分享

  • tell( ) 此方法會告訴你當前讀取了多少個字節,這個數字是從文件開頭算起的字節數。

代碼示例:

file_str = open("E:/test.txt")

print(file_str.read())
print("讀取了:",file_str.tell(),"個字節")

file_str.close()

運行結果:

[‘TestNumber:’, 123, 45, 12.5]
讀取了: 31 個字節

  • seek( )
    如果要改變文件當前的讀取位置, 可以使用 f.seek(offset, from_what) 函數。
    from_what 的值, 如果是 0 表示開頭, 如果是 1 表示當前位置, 2 表示文件的結尾,例如:

    • seek( x , 0 ) : 從起始位置即文件首行首字符開始移動 x 個字符

    • seek( x , 1 ) : 表示從當前位置往後移動x個字符

    • seek( -x , 2 ):表示從文件的結尾往前移動x個字符

from_what 值為默認為0,即文件開頭。下面給出一個完整的例子:

# 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
file_str = open("E:/test.txt","rb+")

file_str.write(b‘0123456789‘)

print(file_str.seek(5,0),end=" ") # 移動到文件的第六個字節
print(file_str.seek(3,1),end=" ")  # 從當前的讀取位置移動三個字節
print(file_str.seek(-3,2),end=" ")  # 移動到文件的倒數第三字節

file_str.close()

運行結果:

5 8 7

  • close( ) 方法,從以上演示可以看到每一個示例代碼的末尾都調用了這個方法,這是因為要關閉對文件的操作資源占用,如果不關閉的話,當程序運行時去打開這個文件就會顯示文件被占用。因為一個file對象調用close( ) 方法後就會關閉文件並釋放系統資源,所以如果再嘗試通過該對象去進行讀寫文件的操作,就會拋出異常。

代碼示例:

>>> file_str = open("E:/test.txt")
>>> file_str.close()
>>> file_str.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file


with 關鍵字

當處理一個file對象時, 使用 with 關鍵字是非常好的方式。在文件讀寫操作結束後, 它會自動幫你正確的關閉文件。這樣就不需要每次都使用finally最終塊來確保關閉資源了。
代碼示例:

# 需要使用as關鍵字來把file對象賦值給一個變量,所以在這裏file_str是一個變量
>>> with open("E:/test.txt") as file_str:
...     read_data = file_str.read()
>>> f.closed  # 如果資源關閉返回出True,否則返回False
True

從上面這個示例可以看到,我並沒有調用 close( ) 方法,with自動幫我正確的關閉了文件,因為with的這一個方便之處,所以with關鍵字很常用。

文件對象還有其他方法, 如 isatty() 和 trucate(), 但這些通常比較少用,就不贅述了。


pickle 模塊

python的pickle模塊實現了基本的數據序列和反序列化。
通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲。
通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。
簡單來說,pickle可以保存和加載幾乎任何的python數據對象,例如列表、字典、元組等。我們可以通過pickle把這些數據對象存儲到文件中(序列化),反過來(反序列化)也可以把文件中保存的這些數據再讀取到程序的內存中。

pickle模塊提供了兩個方法,一個是 dump( ) 一個是 load( ) ,前者用於將數據對象保存到文件中,後者用於將保存到文件中的數據讀取到內存中。要註意的一點是:這種形式保存的數據將會是二進制的形式,也就是說並非保存為普通的文本文件而是一個二進制文件。

下面使用一個實際的例子來簡單的演示一下dump方法的應用方式,代碼示例:

# 導入pickle模塊
import pickle

# 這是一個列表數據對象
listData=[["test","file"],("dump",78),{"name":"lisi"},"zero",12.5,100]

# 以二進制的模式打開文件
with open("E:/test.txt","wb") as file_str :
    pickle.dump(listData,file_str)  # 將數據對象寫入到文件中

運行結果:

技術分享

因為是二進制形式的數據,所以用文本打開就會是一片亂碼。

然後再使用load方法,就可以將數據再讀取回來,並且數據類型依舊是列表,代碼示例:

# 導入pickle模塊
import pickle

# 以二進制的模式打開文件
with open("E:/test.txt", "rb") as file_str:
    listData = pickle.load(file_str)  # 讀取文件中的二進制數據
    print("讀取出來的數據:", listData)
    print("該數據的類型是:", type(listData))

運行結果:

讀取出來的數據: [[‘test’, ‘file’], (‘dump’, 78), {‘name’: ‘lisi’}, ‘zero’, 12.5, 100]
該數據的類型是: <class ‘list‘>

pickle模塊主要就是像以上示例一樣,用於將某個數據對象保存到文件中,這樣就可以永久存儲,然後還可以再次將這些數據再讀取到內存中。


File對象方法:

file 對象使用 open 函數來創建,下表列出了 file 對象常用的函數:

技術分享



本文出自 “zero” 博客,請務必保留此出處http://zero01.blog.51cto.com/12831981/1980934

Python3 輸入和輸出