Python3基礎(chǔ)之輸入和輸出實(shí)例分析
通常來(lái)說(shuō),一個(gè)Python程序可以從鍵盤讀取輸入,也可以從文件讀取輸入;而程序的結(jié)果可以輸出到屏幕上,也可以保存到文件中便于以后使用。本文就來(lái)介紹Python中最基本的I/O函數(shù)。
一、控制臺(tái)I/O
1.讀取鍵盤輸入
內(nèi)置函數(shù)input([prompt]),用于從標(biāo)準(zhǔn)輸入讀取一個(gè)行,并返回一個(gè)字符串(去掉結(jié)尾的換行符):
s = input("Enter your input:")
注:在Python 3.x版本中取消了 raw_input() 函數(shù)。
2.打印到屏幕
最簡(jiǎn)單的輸出方法是用print語(yǔ)句,你可以給它傳遞零個(gè)或多個(gè)用逗號(hào)隔開(kāi)的表達(dá)式:
print([object, ...][, sep=' '][, end='endline_character_here'][, file=redirect_to_here])
方括號(hào)內(nèi)是可選的,sep表示分割符,end表示結(jié)束符,file表示重定向文件。如果要給sep、end、file指定值必須使用關(guān)鍵字參數(shù)。
print('hello', 'world', sep='%') # 輸出 hello%world
print('hello', 'world', end='*') # 輸出 hello world*,并且不換行
二、文件I/O
讀寫(xiě)文件之前,先用open()函數(shù)打開(kāi)一個(gè)文件,它會(huì)返回一個(gè)文件對(duì)象(file object):
f = open(filename,mode)
如果不指定mode參數(shù),文件將默認(rèn)以‘r'模式打開(kāi)。模式中的字符有:
r:只讀
w:只寫(xiě),如果文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件
+:讀寫(xiě)(不能單獨(dú)使用)
a:打開(kāi)文件用于追加,只寫(xiě),不存在則創(chuàng)建新文件
b:以二進(jìn)制模式打開(kāi)(不能單獨(dú)使用)
所以可能的模式大概有r、w、r+、w+、rb、wb、rb+、wb+、a、a+、ab、ab+,注意只有w和a可以創(chuàng)建文件。
通常情況下,文件都是以文本模式(text mode)打開(kāi)的,也就是說(shuō),從文件中讀寫(xiě)的是以一種特定的編碼格式進(jìn)行編碼(默認(rèn)的是 UTF-8)的字符串。如果文件以二進(jìn)制模式(binary mode)打開(kāi),數(shù)據(jù)將以字節(jié)對(duì)象的形式進(jìn)行讀寫(xiě):
f = open('a.txt','wb+')
f.write('I like apple!') # 報(bào)錯(cuò)
f.write(b'I like apple!') # 以bytes對(duì)象的形式進(jìn)行讀寫(xiě)
Bytes對(duì)象是0到127的不可修改的整數(shù)序列,或純粹的 ASCII 字符,它的用途是存儲(chǔ)二進(jìn)制數(shù)據(jù)。
可以通過(guò)在一個(gè)字符串前面加上'b'來(lái)創(chuàng)建一個(gè)bytes literal;
也可以通過(guò)bytes() 函數(shù)創(chuàng)建一個(gè) bytes 對(duì)象。
注意:如果bytes() 函數(shù)的初始化器是一個(gè)字符串,那么必須提供一種編碼。
b1 = b'This is string'
b2 = bytes('This is string', 'UTF-8') # 必須指定編碼格式
字符串對(duì)象與字節(jié)對(duì)象是不兼容的,要將 bytes 轉(zhuǎn)變?yōu)?str, bytes 對(duì)象必須要進(jìn)行解碼,使用decode() 方法:
b = bytes('This is string', 'UTF-8')
print(b, b.decode(), sep='\n')
# 輸出:
# b'This is string'
# This is string
文件對(duì)象的方法(假設(shè)f是一個(gè)文件對(duì)象):
f.read(size) :讀取size個(gè)字節(jié)的數(shù)據(jù),然后作為字符串或 bytes 對(duì)象返回。size是一個(gè)可選參數(shù),如果不指定size,則讀取文件的所有內(nèi)容。
f.readline() :讀取一行。在字符串末尾會(huì)留下?lián)Q行符 (\n),如果到文件尾,返回空字符串。
f.readlines() :讀取所有行,儲(chǔ)存在列表中,每個(gè)元素是一行,相當(dāng)于list(f)。
f.write(string) :將 string 寫(xiě)入到文件中,返回寫(xiě)入的字符數(shù)。如果以二進(jìn)制模式寫(xiě)文件,需要將string轉(zhuǎn)換為 bytes 對(duì)象。
f.tell() :返回文件對(duì)象當(dāng)前所處的位置,它是從文件開(kāi)頭開(kāi)始算起的字節(jié)數(shù)。
f.seek(offset, from_what) :改變文件對(duì)象所處的位置。offset是相對(duì)參考位置的偏移量,from_what 取值 0(文件頭, 默認(rèn))、1(當(dāng)前位置)、2(文件尾)表示參考位置。
f.close() :關(guān)閉文件對(duì)象。
這些都是很常用的方法,當(dāng)然文件對(duì)象不止這些方法。根據(jù)打開(kāi)的模式不同,open() 返回的文件對(duì)象類型也不同:
TextIOWrapper:文本模式,返回TextIOWrapper對(duì)象。
BufferedReader:讀二進(jìn)制,即rb,返回BufferedReader對(duì)象。
BufferedWriter:寫(xiě)和追加二進(jìn)制,即wb、ab,返回BufferedWriter對(duì)象。
BufferedRandom:讀/寫(xiě)模式,即含有+的模式,返回BufferedRandom對(duì)象。
可以在這些文件對(duì)象上運(yùn)行 dir() 或 help(),查看它們所有的方法。
補(bǔ)充:
1、在文本模式下,seek()方法只會(huì)相對(duì)于文件起始位置進(jìn)行定位。(除了定位文件尾可以用 seek(0, 2)之外)
2、可以循環(huán)迭代一個(gè)文件對(duì)象一行一行讀?。?/p>
for line in f: print(line, end='')
三、格式化輸出
一般來(lái)說(shuō),我們希望更多的控制輸出格式,而不是簡(jiǎn)單的以空格分割。這里有兩種方式:
第一種是由你自己控制。使用字符串切片、連接操作以及 string 包含的一些有用的操作。
第二種是使用str.format()方法。
下面給一個(gè)示例:
# 第一種方式:自己控制
for x in range(1, 11):
print(str(x).rjust(2), str(x*x).rjust(3), end=' ')
print(str(x*x*x).rjust(4))
# 第二種方式:str.format()
for x in range(1, 11):
print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
# 輸出都是:
# 1 1 1
# 2 4 8
# 3 9 27
# 4 16 64
# 5 25 125
# 6 36 216
# 7 49 343
# 8 64 512
# 9 81 729
# 10 100 1000
第一種方式中,字符串對(duì)象的 str.rjust() 方法的作用是將字符串靠右,并默認(rèn)在左邊填充空格,類似的方法還有 str.ljust() 和 str.center() 。這些方法并不會(huì)寫(xiě)任何東西,它們僅僅返回新的字符串,如果輸入很長(zhǎng),它們并不會(huì)截?cái)嘧址?。我們注意到,同樣是輸出一個(gè)平方與立方表,使用str.format()會(huì)方便很多。
str.format()的基本用法如下:
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
括號(hào)及括號(hào)里的字符將會(huì)被 format() 中的參數(shù)替換.。括號(hào)中的數(shù)字用于指定傳入對(duì)象的位置:
>>> print('{0} and {1}'.format('Kobe', 'James'))
Kobe and James
>>> print('{1} and {0}'.format('Kobe', 'James'))
James and Kobe
如果在 format() 中使用了關(guān)鍵字參數(shù),那么它們的值會(huì)指向使用該名字的參數(shù):
>>> print('The {thing} is {adj}.'.format(thing='flower', adj='beautiful'))
The flower is beautiful.
可選項(xiàng)':'和格式標(biāo)識(shí)符可以跟著 field name,這樣可以進(jìn)行更好的格式化:
>>> import math
>>> print('The value of PI is {0:.3f}.'.format(math.pi))
The value of PI is 3.142.
在':'后傳入一個(gè)整數(shù),可以保證該域至少有這么多的寬度,用于美化表格時(shí)很有用:
>>> table = {'Jack':4127, 'Rose':4098, 'Peter':7678}
>>> for name, phone in table.items():
... print('{0:10} ==> {1:10d}'.format(name, phone))
...
Peter ==> 7678
Rose ==> 4098
Jack ==> 4127
我們還可以將參數(shù)解包進(jìn)行格式化輸出。例如,將table解包為關(guān)鍵字參數(shù):
table = {'Jack':4127, 'Rose':4098, 'Peter':7678}
print('Jack is {Jack}, Rose is {Rose}, Peter is {Peter}.'.format(**table))
# 輸出:Jack is 4127, Rose is 4098, Peter is 7678.
補(bǔ)充:
% 操作符也可以實(shí)現(xiàn)字符串格式化。它將左邊的參數(shù)作為類似 sprintf() 式的格式化字符串,而將右邊的代入:
import math
print('The value of PI is %10.3f.' %math.pi)
# 輸出:The value of PI is 3.142.
因?yàn)檫@種舊式的格式化最終會(huì)從Python語(yǔ)言中移除,應(yīng)該更多的使用 str.format() 。
附:文本模式與二進(jìn)制模式
1、在Windows系統(tǒng)中,文本模式下,默認(rèn)是將Windows平臺(tái)的行末標(biāo)識(shí)符 \r\n 在讀時(shí)轉(zhuǎn)為 \n ,而在寫(xiě)時(shí)將 \n 轉(zhuǎn)為 \r\n 。 這種隱藏的行為對(duì)于文本文件是沒(méi)有問(wèn)題的,但是對(duì)于二進(jìn)制數(shù)據(jù)像 JPEG 或 EXE 是會(huì)出問(wèn)題的。在使用這些文件時(shí)請(qǐng)小心使用二進(jìn)制模式。
2、在類Unix/Linux系統(tǒng)中,行末標(biāo)識(shí)符為 \n,即文件以 \n 代表?yè)Q行。所以Unix/Linux系統(tǒng)中在文本模式和二進(jìn)制模式下并無(wú)區(qū)別。
本文所述實(shí)例讀者可以實(shí)際動(dòng)手操作測(cè)試一下,以加深印象,從而進(jìn)一步牢固掌握Python基礎(chǔ)。
相關(guān)文章
Python靜態(tài)類型檢查新工具之pyright 使用指南
這篇文章主要介紹了Python靜態(tài)類型檢查新工具之pyright 使用指南,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Python實(shí)現(xiàn)隨機(jī)生成一個(gè)漢字的方法分享
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)隨機(jī)生成一個(gè)漢字的功能,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Python有一定的幫助,需要的可以參考一下2023-01-01
Python實(shí)戰(zhàn)基礎(chǔ)之繪制餅狀圖分析商品庫(kù)存
餅狀圖(pie chart)一般用于描述分類型數(shù)據(jù)的相對(duì)頻數(shù)或百分?jǐn)?shù)頻數(shù)分布,呈現(xiàn)部分與總體的關(guān)系,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)戰(zhàn)基礎(chǔ)之繪制餅狀圖分析商品庫(kù)存的相關(guān)資料,需要的朋友可以參考下2022-07-07
Tensorflow矩陣運(yùn)算實(shí)例(矩陣相乘,點(diǎn)乘,行/列累加)
今天小編就為大家分享一篇Tensorflow矩陣運(yùn)算實(shí)例(矩陣相乘,點(diǎn)乘,行/列累加),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python利用selenium進(jìn)行瀏覽器爬蟲(chóng)

