一、標準輸入輸出
1、列印到螢幕
產生輸出的最簡單方法是使用print語句,可以通過用逗號分隔零個或多個運算式。這個函數傳遞運算式轉換為一個字串,如下結果寫到標準輸出 -
print ("Python is really a great language,", "isn't it?")
這將產生以下結果標準螢幕上 :
Python is really a great language, isn't it?
2、讀取鍵盤輸入
Python2中有兩個內建的函數可從標準輸入讀取資料,它預設來自鍵盤。這些函數分別是:input() 和 raw_input()。
但在Python3中,raw_input()函數已被棄用。此外, input() 函數是從鍵盤作為字串讀取資料,不論是否使用引號(”或“”)。
樣本:
x=input("請輸入x=")y=input("請輸入y=")z=x+yprint("x+y="+z)
運行結果:
請輸入x=111請輸入y=222x+y=111222
可以看到input的傳回值永遠是字串,當我們需要返回int型時需要使用int(input())的形式,例如:
x=int(input("請輸入x="))y=int(input("請輸入y="))z=x+yprint("x+y=",z)
運行結果如下:
請輸入x=111請輸入y=222x+y= 333
3、格式化輸出
一般來說,我們希望更多的控制輸出格式,而不是簡單的以空格分割。這裡有兩種方式:
第一種是由你自己控制。使用字串切片、串連操作以及 string 包含的一些有用的操作。
樣本:
# 第一種方式:自己控制 for x in range(1, 11): print(str(x).rjust(2), str(x*x).rjust(3), end=' ') print(str(x*x*x).rjust(4))
輸出:
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 72910 100 1000
第一種方式中,字串對象的 str.rjust() 方法的作用是將字串靠右,並預設在左邊填充空格,所佔長度由參數指定,類似的方法還有 str.ljust() 和 str.center() 。這些方法並不會寫任何東西,它們僅僅返回新的字串,如果輸入很長,它們並不會截斷字串。
第二種是使用str.format()方法。
用法:它通過{}和:來代替傳統%方式 使用位置參數
要點:從以下例子可以看出位置參數不受順序約束,且可以為{},只要format裡有相對應的參數值即可,參數索引從0開,傳入位置參數列表可用*列表的形式。
>>> li = ['hoho',18]>>> 'my name is {} ,age {}'.format('hoho',18)'my name is hoho ,age 18'>>> 'my name is {1} ,age {0}'.format(10,'hoho')'my name is hoho ,age 10'>>> 'my name is {1} ,age {0} {1}'.format(10,'hoho')'my name is hoho ,age 10 hoho'>>> 'my name is {} ,age {}'.format(*li)'my name is hoho ,age 18'
使用關鍵字參數
要點:關鍵字參數值要對得上,可用字典當關鍵字參數傳入值,字典前加**即可
>>> hash = {'name':'hoho','age':18}>>> 'my name is {name},age is {age}'.format(name='hoho',age=19)'my name is hoho,age is 19'>>> 'my name is {name},age is {age}'.format(**hash)'my name is hoho,age is 18'
填充與格式化
格式:{0:[填充字元][對齊 <^>][寬度]}.format()
>>> '{0:*>10}'.format(20) ##靠右對齊'********20'>>> '{0:*<10}'.format(20) ##靠左對齊'20********'>>> '{0:*^10}'.format(20) ##置中對齊'****20****'
精度與進位
>>> '{0:.2f}'.format(1/3)'0.33'>>> '{0:b}'.format(10) #二進位'1010'>>> '{0:o}'.format(10) #八進位'12'>>> '{0:x}'.format(10) #16進位'a'>>> '{:,}'.format(12369132698) #千分位格式化'12,369,132,698'
使用索引
>>> li['hoho', 18]>>> 'name is {0[0]} age is {0[1]}'.format(li)'name is hoho age is 18
二、檔案IO
Python提供了基本的功能和必要的預設操作檔案的方法。使用一個 file 對象來做大部分的檔案操作。 1、open 函數
在讀取或寫入一個檔案之前,你必須使用 Python 內建open()函數來開啟它。 該函數建立一個檔案對象,這將被用來調用與它相關的其他支援方式。
文法:
file object = open(file_name [, access_mode][, buffering])
下面是參數的詳細資料:
file_name: 檔案名稱(file_name )參數是包含您要訪問的檔案名稱的字串值。
access_mode: access_mode指定該檔案已被開啟,即讀,寫,追加等方式。可能值的完整列表,在表中如下。這是可選的參數,預設檔案訪問模式是讀(r)。
buffering: 如果該緩衝值被設定為0,則表示不使用緩衝。如果該緩衝值是1,則在訪問一個檔案進行時行緩衝。如果指定緩衝值大於1的整數,緩衝使用所指示的緩衝器大小進行。如果是負數,緩衝區大小是系統預設的(預設行為)。
通常,檔案以文本的形式開啟,這意味著,你從檔案讀出和向檔案寫入的字串會被特定的編碼方式(預設是UTF-8)編碼。
模式後面可以追加參數 ‘b’ 表示以二進位模式開啟檔案:資料會以位元組對象的形式讀出和寫入。這種模式應該用於所有不包含文本的檔案。在文字模式下,讀取時預設會將平台有關的行結束符(Unix上是 \n , Windows上是 \r\n)轉換為 \n。在文字模式下寫入時,預設會將出現的 \n 轉換成平台有關的行結束符。這種暗地裡的修改對 ASCII 文字檔沒有問題,但會損壞 JPEG 或 EXE 這樣的二進位檔案中的資料。使用二進位模式讀寫此類檔案時要特別小心。 2、file 對象屬性
一旦檔案被開啟,則就會有一個檔案對象,你就可以得到有關該檔案的各種資訊。
file.closed:如果檔案被關閉返回true,否則為false
file.mode :返迴文件開啟訪問模式
file.name :返迴文件名
測試:
# Open a filefo = open("foo.txt", "wb")print ("Name of the file: ", fo.name)print ("Closed or not : ", fo.closed)print ("Opening mode : ", fo.mode)fo.close()print ("Closed or not : ", fo.closed)
運行結果:
Name of the file: foo.txtClosed or not : FalseOpening mode : wbClosed or not : True
3、file對象的方法
假設已經建立了一個稱為 f 的檔案對象。 f.read()
為了讀取一個檔案的內容,調用 f.read(size), 這將讀取一定數目的資料, 然後作為字串或位元組對象返回。
size 是一個可選的數字類型的參數。 當 size 被忽略了或者為負, 那麼該檔案的所有內容都將被讀取並且返回。
以下執行個體假定檔案 foo.txt 已存在且內容如下:
Hello World。Hello Python。
代碼如下:
# 開啟一個檔案f = open("foo.txt", "r",encoding= 'UTF-8')str = f.read()print(str)# 關閉開啟的檔案f.close()
執行以上程式,輸出結果為:
Hello World。Hello Python。
f.readline()
f.readline() 會從檔案中讀取單獨的一行。分行符號為 ‘\n’。f.readline() 如果返回一個Null 字元串, 說明已經已經讀取到最後一行。
# 開啟一個檔案f = open("foo.txt", "r",encoding= 'UTF-8')str = f.readline()print(str)# 關閉開啟的檔案f.close()
執行以上程式,輸出結果為:
Hello World。
f.readlines()
f.readlines() 將返回該檔案中包含的所有行。
如果設定選擇性參數 sizehint, 則讀取指定長度的位元組, 並且將這些位元組按行分割。
# 開啟一個檔案f = open("foo.txt", "r",encoding= 'UTF-8')str = f.readlines()print(str)# 關閉開啟的檔案f.close()
執行以上程式,輸出結果為:
['Hello World。\n', 'Hello Python。']
另一種方式是迭代一個檔案對象然後讀取每行:
# 開啟一個檔案f = open("foo.txt", "r",encoding="UTF-8")for line in f: print(line, end='')# 關閉開啟的檔案f.close()
執行以上程式,輸出結果為:
Hello World。Hello Python。
這個方法很簡單, 但是並沒有提供一個很好的控制。 因為兩者的處理機制不同, 最好不要混用。 f.write()
f.write(string) 將 string 寫入到檔案中, 然後返回寫入的字元數。
# 開啟一個檔案f = open("foo.txt", "w",encoding="UTF-8")num = f.write( "Python 是一個非常好的語言。\n是的,的確非常好!!\n" )print(num)# 關閉開啟的檔案f.close()
執行以上程式,輸出結果為:
29
開啟foo.txt其內容如下:
Python 是一個非常好的語言。是的,的確非常好!!
如果要寫入一些不是字串的東西, 那麼將需要先進行轉換:
# 開啟一個檔案f = open("foo.txt", "w",encoding="UTF-8")value = ('www.baidu.com', 666)s = str(value)f.write(s)# 關閉開啟的檔案f.close()
執行以上程式,開啟 foo.txt 檔案:
('www.baidu.com', 666)
f.tell()
f.tell() 返迴文件對象當前所處的位置, 它是從檔案開頭開始算起的位元組數。 f.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,即檔案開頭。下面給出一個完整的例子:
>>> f = open('foo.txt', 'rb+')>>> f.write(b'0123456789abcdef')16>>> f.seek(5) # 移動到檔案的第六個位元組5>>> f.read(1)b'5'>>> f.seek(-3, 2) # 移動到檔案的倒數第三位元組13>>> f.read(1)b'd'
在文字檔中 (那些開啟檔案的模式下沒有 b 的), 只會相對於檔案起始位置進行定位。
當你處理完一個檔案後, 調用 f.close() 來關閉檔案並釋放系統的資源,如果嘗試再調用該檔案,則會拋出異常。
>>> f.close()>>> f.read()Traceback (most recent call last): File "<stdin>", line 1, in ?ValueError: I/O operation on closed file
當處理一個檔案對象時, 使用 with 關鍵字是非常好的方式。在結束後, 它會幫你正確的關閉檔案。 而且寫起來也比 try - finally 語句塊要簡短:
>>> with open('/tmp/foo.txt', 'r') as f:... read_data = f.read()>>> f.closedTrue
4、使用 json 儲存結構化資料
從檔案中讀寫字串很容易。數值就要多費點兒周折,因為 read() 方法只會返回字串,應將其傳入 int() 這樣的函數,就可以將 ‘123’ 這樣的字串轉換為對應的數值 123。當你想要儲存更為複雜的資料類型,例如嵌套的列表和字典,手工解析和序列化它們將變得更複雜。
Python 允許你使用常用的資料交換格式 JSON(JavaScript Object Notation)。標準模組 json 可以接受 Python 資料結構,並將它們轉換為字串表示形式;此過程稱為 序列化。從字串表示形式重新構建資料結構稱為 還原序列化。序列化和還原序列化的過程中,表示該對象的字串可以儲存在檔案或資料中,也可以通過網路連接傳送給遠端機器。
如果你有一個對象 x,你可以用簡單的一行代碼查看其 JSON 字串表示形式:
>>> json.dumps([1, 'simple', 'list'])'[1, "simple", "list"]'
dumps() 函數的另外一個變體 dump(),直接將對象序列化到一個檔案。所以如果 f 是為寫入而開啟的一個 檔案對象,我們可以這樣做:
json.dump(x, f)
為了重新解碼對象可以採用:
x = json.load(f)
我們來編寫一個儲存一組數位簡短程式,再編寫一個將這些數字讀取到記憶體中的程式,第一個程式使用json.dump()來儲存這組數字,第二個程式將使用json.load()
函數json.dump()接受兩個實參:要儲存的資料以及可以用於儲存資料的檔案對象。下面是示範 樣本一
import jsonnumber = [1,2,3,5]file_name = 'number.json' #通過副檔名指紋檔案儲存體的資料為json格式with open(file_name,'w') as file_object: json.dump(number,file_object)
我們先匯入json模組,再建立一個是數字列表,我們指定存放在number.json裡,檔案尾碼是.json來指出檔案儲存體的資料是json格式,我們再以寫入模式開啟檔案,讓json能見資料寫入其中使用json.dump()將資料寫入,我們沒有寫輸出語句,開啟這個檔案查看,資料存放區的格式與python一樣。
注意json.dump()方法,傳遞兩個參數 第一個要寫入的資料,第二個要儲存的位置的檔案對象。 樣本二
再寫一個程式,使用json.load()讀取到記憶體中
import jsonfile_name = 'number.json' #通過副檔名指紋檔案儲存體的資料為json格式with open(file_name,'r') as file_object: contents = json.load(file_object)print(contents)
這是在程式間共用資料的簡單方式 儲存和讀取使用者產生的資料
對於使用者輸入的資料,用json來儲存大有裨益,因為如果不以某種方式進行儲存,等程式停止運行時使用者的資訊將丟失。 看一個例子
使用者首次運行程式時被提示輸入自己的名字,再次運行程式時就記住他了,我們先儲存名字
ipt = input('enter your name')filename1 = 'name.json'with open(filename1,'w') as file_object: json.dump(ipt, file_object)
再讀取之前儲存的名字
with open(filename1,'r') as file_object: name_ipt = json.load(file_object)print('wleccome %s'%name_ipt)
我們將這兩個程式合并到一個內,在執行的時候先去name.json嘗試獲得使用者名稱,如果沒有這檔案,用try-except處理這個錯誤,併入使用者輸入名字並儲存到name.json中
import jsonfilename1 = 'name.json'try: with open(filename1)as file_object: username = json.load(file_object)except FileNotFoundError: with open(filename1,'w') as file_object2: user_ipt = input('enter your name i will rember you: ') json.dump(user_ipt,file_object2)else: print(username)
三、OS模組常用方法
Python的os模組提供了執行檔案處理操作,如重新命名和刪除檔案的方法。要使用這個模組,需要先匯入它,然後就可以調用任何相關的功能了。 1、重新命名和刪除檔案 rename() 方法
rename()方法有兩個參數,當前檔案名稱和新的檔案名稱。
os.rename(current_file_name, new_file_name)
樣本
以下為例子用來重新命名現有檔案 test1.txt 為 test2.txt:
#!/usr/bin/python3import os# Rename a file from test1.txt to test2.txtos.rename( "test1.txt", "test2.txt" )
remove() 方法
可以使用 remove()方法通過提供參數檔案名稱(file_name)來刪除檔案。
os.remove(file_name)
樣本
下面是刪除現有檔案 test2.txt 的例子 -
#!/usr/bin/python3import os# Delete file test2.txtos.remove("text2.txt")
2、Python目錄
所有的檔案都包含不同的目錄中,Python處理這些目錄操作也沒有什麼問題。os模組中有用於建立,刪除和更改目錄的幾種方法。 mkdir() 方法
可以使用os模組中的 mkdir()方法在目前的目錄下建立目錄。需要提供一個參數到這個方法指定要建立的目錄名。
os.mkdir("newdir")
樣本
下面是在目前的目錄建立 test 目錄的例子 -
#!/usr/bin/python3import os# Create a directory "test"os.mkdir("test")
chdir() 方法
可以使用 chdir() 方法來改變目前的目錄。chdir() 方法接受一個參數,就是你想在目前的目錄建立的目錄的目錄名稱。
os.chdir("newdir")
樣本
以下是進入 “/home/newdir” 目錄的例子-
#!/usr/bin/python3import os# Changing a directory to "/home/newdir"os.chdir("/home/newdir")
getcwd()方法
getcwd()方法顯示當前的工作目錄。
os.getcwd()
樣本
以下是獲得目前的目錄的例子 -
#!/usr/bin/python3import os# This would give location of the current directoryos.getcwd()
rmdir() 方法
rmdir()方法刪除目錄,這是作為方法的參數傳遞。
刪除目錄前,它的所有內容應該先刪除。
os.rmdir('dirname')
樣本
以下是刪除 “/tmp/test” 目錄的例子。它需要給定目錄的完全合格的名稱,否則會從目前的目錄搜尋目錄。
#!/usr/bin/python3import os# This would remove "/tmp/test" directory.os.rmdir( "/tmp/test" )