一個「MacBook」新手的Python「笨辦法」自學之旅 #第八章:參數、解包和變量、提示和傳遞、讀取文件、讀寫文件

 

第八章:參數、解包和變量、提示和傳遞、讀取文件、讀寫文件python

 

我要瘋了,寫到了習題16,結果網頁出現問題,重新寫!!!!app

 

 

----------------------------------<習題13:參數、解包、變量>---------------------------------------ide

   先介紹幾個名詞:腳本、參數、參數變量、解包、特性、模塊函數

   腳本script:我在上一章也屢次提到腳本,忘記解釋了,其實我也是學到這個習題才注意到腳本的概念。腳本就是你編寫的.py程序。網站

   參數argument:例如一個函數運行,須要某些參數,多了不行,少了也不行。url

   參數變量argv(argument variable):這是一個變量,它能夠保存你運行python腳本時傳遞給Python腳本的參數。它適用於須要用戶在輸入腳本運行命令時,就要輸入不能更改的參數,用以賦值給argv的變量們(第一個除外)spa

   解包unpack:把參數變量argv種的東西解包,並將全部的參數依次賦值給其它變量(該變量的名稱可自行設計).net

   特性、模塊module、庫library、軟件包:它們的概念是同樣的,都是Python系統自帶的一個軟件庫,能夠用import命令調用。命令行

   具體如何運用,參考ex13_1.py,代碼以下:在該代碼中,也能夠看到argv和raw_input()的區別設計

 

 1 #-*-coding:utf-8-*-
 2 
 3 from sys import argv
 4 
 5 script_name, a, b, c, d, e, f = argv
 6 # argv 的第一個變量不須要賦值,默認是腳本的名稱
 7 # 因此在運行該腳本時,須要在腳本ex13_1.py後面鍵入6個參數,分別對應六個變量abcdef
 8 # python ex13_1.py 1 2 3 4 5 6 
 9 
10 print "script_name is :", script_name #這裏的變量名,必須跟參數變量裏面的名字一致, 
11 print "the first number is  :", a
12 print "the second number is  :", b
13 print "the third number is  :", c
14 print "the fourth number is  :", d
15 print "the fifth number is  :", e
16 print "the sixth number is  :", f
17 
18 
19 #一樣都是須要用戶輸入參數,對比argv和raw_input()的區別
20 print "x=",
21 x = raw_input()
22 print "y=",
23 y = raw_input()
24 
25 
26 
27 
28 # raw_input()和argv的區別是:raw_iput()是在腳本運行的過程當中輸入參數,
29 # 而argv是在編寫運行腳本的命令行時輸入參數
ex13_1.py

    終端運行結果以下:

 

--------------------------------------<習題14:提示和傳遞>--------------------------------------

   該習題就只是簡單的介紹一下修改提示符,例如raw_input('>-')中的>-就時修改提示符。ex14.py將該提示符賦值給一個叫prompt的變量,是爲了統一修改提示符的格式。須要使用時,就像raw_input(prompt)便可。

   ex14.py的代碼以下:

 1 # -*-coding:utf-8-*-
 2 
 3 from sys import argv
 4 
 5 script, user_name = argv #在python運行ex14_py是,須要輸入一個字符,用於定義user_name
 6 prompt = '>-' #raw_input()後面答案的提示符
 7 
 8 print "Hi %s, I'm the %s script." % (user_name, script)
 9 print "I'd like to ask you a few question."
10 print "Do you like me? %s?" % user_name # 也可用%r
11 likes = raw_input (prompt)
12 
13 print "Where do you live? %s?" % user_name
14 lives = raw_input(prompt) #其實能夠直接把該處的prompt該處'>-',該處設置一個prompt,僅僅是爲了統一提示符的格式
15 
16 print "What kind of computer do you have?"
17 computer = raw_input(prompt)
18 
19 # 三個引號是能夠定義多行字符串
20 print """ 
21 Alright, so you said %r about liking me.
22 You live in %r, Not sure where that is.
23 And you have a %r computer.Nice.
24 """ % (likes, lives, computer)
ex14_py

   終端運行結果以下:

   

 

--------------------------------------<習題15:讀取文件>--------------------------------------

   能不能用一段代碼來讀取你電腦裏存的文件呢?答案時確定的。

   首先介紹兩個函數和一個符號.':txt = open(filename)、 txt.read()

   open():打開文件名了,須要在括號內鍵入文件的名稱,並且能夠將open()的結果賦值給一個變量,本文是複製給 變量txt。

   read(): 讀取文件的函數,也能夠將讀出的結果賦值給一個變量

   txt.read()中的小數點'.':它的做用相似於「執行」的意思,變量txt「執行」read()函數

 

   ex15_sample.txt 的內容以下:

1 This is stuff I typed into a file.
2 It is really cool stuff.
3 Lots and lots of fun to have in here.
ex15_sample.txt

   ex15.py代碼以下:

 1 # -*-coding:utf-8-*-
 2 from sys import argv
 3 
 4 script, filename = argv 
 5 
 6 txt = open(filename) #執行 python ex15.py ex15_example.txt, 該文本是提早在目錄temp/ex中建立完成的
 7 # 是爲了將文本「ex15_example.txt"輸入到txt=open(),該文本至關於一個參數,而且供下面的%r命令使用
 8 
 9 print "Here's your file %r:" % filename # 
10 print txt.read() #txt.read命令,不須要輸入參數,直接執行read命令,對象是txt
11 
12 print "Type the filename again:"
13 file_again = raw_input(">") #用>字符提示raw_input()的輸出結果
14 
15 txt_again = open(file_again)
16 
17 print txt_again.read() #txt_again.read命令,不須要輸入參數,直接執行read命令,對象是txt_again
ex15.py

   ex15.py終端運行結果以下:

   

 

   即然有了open()函數,那有沒有close()函數呢? 求助! 求助! 求助! 求助!答案也是確定的,並且當你再也不讀或者用某個文本時,用close()函數將其關閉,是一個很好的習慣,至於爲何,我也不太清楚,但願懂得的朋友實例解釋一下,謝謝啦。

   若是文檔用close()函數關閉了,就沒法再被read(),否者會報錯。見代碼ex15_2.py:

 1 # -*-coding:utf-8-*-
 2 from sys import argv
 3 
 4 script, filename = argv 
 5 
 6 txt = open(filename) #執行 python ex15_2.py ex15_example.txt, 該文本是提早在目錄temp/ex中建立完成的
 7 # 是爲了將文本「ex15_example.txt"輸入到txt=open(),該文本至關於一個參數,而且供下面的%r命令使用
 8 
 9 print "Here's your file %r:" % filename # 
10 print txt.read() #txt.read命令,不須要輸入參數,直接執行read命令,對象是txt
11 
12 txt.close() #關閉打開的文件
13 
14 # print txt.read() 這段代碼會報錯,由於txt已經執行了close()命令,沒法再被讀。
ex15_2.py

 

 

求助!求助! 求助! 求助! 這個習題講的是打開和閱讀本地文檔,其中有一個前提就是:Python腳本ex15..py必須和文本ex15_sample.txt在同一個目錄下,可是若是我想讀取其它目錄下的文本,該如何操做呢?利用url?

 

 

--------------------------------------<習題16:讀寫文件>--------------------------------------

 

   即然能夠讀取文件,那必定也能夠編輯文件吧?習題16講的就是如何編輯文件。

   先介紹幾個函數:close/read/readline/truncate/write(stuff)

   close():關閉文件,形式爲:txt.close();功能就像是TextWrangler、office軟件等的「文件-保存」

   read():讀取文件內容,方式爲:txt.read(),而不能寫成read(txt)

   readline(): 讀取文本文件中的一行

   truncate():清空文件內容,形式爲:txt.truncate()

   write(stuff): 將stuff寫入文件,形式爲:txt.write(stuff)

   

  利用ex16.py腳本往ex16_sample1.txt裏寫東西

   ex16.py代碼以下: 

 1 #-*-coding:utf-8-*-
 2 from sys import argv #從sys軟件包中調取參數變量argv使用。
 3 
 4 script, filename = argv #給argv解壓,
 5 # 而且在運行python ex16.py ex16_sample1.txt時,賦予filename以參數ex16_sample1.txt
 6 
 7 print "We're going to erase %r." %filename 
 8 print "If you don't want that, hit CTRL-C(^C)."
 9 print "If you do want that, hit RETURN."
10 
11 raw_input("?")
12 
13 print "Opening the file..."
14 target = open(filename,'w') #賦予變量target以ex16_sample1.txt
15 
16 print "Truncating the file, Goodbye!"
17 target.truncate()# 清空文檔target中的內容
18 
19 
20 print "Now I'm going to ask you for three lines."
21 
22 line1 = raw_input("line 1:")# 輸入字符串,用於定義line1
23 line2 = raw_input("line 2:")# 輸入字符串,用於定義line2
24 line3 = raw_input("line 3:")# 輸入字符串,用於定義line3
25 
26 print "I'm going to write these to the file."
27 
28 target.write(line1)# 將line1寫入target文本中
29 target.write("\n")# 重起一行
30 target.write(line2)# 將line2寫入target文本中
31 target.write("\n")# 重起一行
32 target.write(line3)# 將line3寫入target文本中
33 target.write("\n")# 重起一行
34 
35 print "And finally, we close it."
36 target.close() #關閉target文本
37 
38 
39 # 是爲了輸出你剛剛寫的txt文檔
40 txt = open(filename, 'r') #文檔必須先被open(),而且將open後的文件賦予變量,而後才能read()這個變量
41 print "Here is the complete txt file you have justed wrote."
42 print "-"*20 #這個命令行,僅僅是爲了終端運行時看起來更清晰
43 print txt.read()
44 txt.close
ex16.py

   終端運行結果以下:

   

   附加練習1:編寫ex16_2.py,要求使用raw_input()和argv兩種方式來讀取剛剛寫的文本ex16_sample1.txt,代碼以下:

 1 #-*-coding:utf-8-*-
 2 #本程序是爲了讀文本ex16_sample1.txt
 3 
 4 print "filename"
 5 filename = raw_input()
 6 
 7 txt = open(filename)
 8 
 9 print "You can find your file here:"
10 print txt.read()
11 
12 txt.close()
13 
14 
15 # 利用argv獲取文本或文件名,必須在整個腳本運行開始的第一條命令行中輸入文件名
16 from sys import argv
17 
18 
19 script, filename = argv
20 
21 txt = open(filename)
22 
23 print "It's your file:"
24 print txt.read()
25 
26 txt.close()
ex16_2.py

 

   附加練習2:編寫ex16_3.py,要求簡化write()命令這段代碼, 代碼以下:

 1 #-*-coding:utf-8-*-
 2 from sys import argv #從sys軟件包中調取參數變量argv使用。
 3 
 4 script, filename = argv #給argv解壓,
 5 # 而且在運行python ex16.py ex16_sample.txt時,賦予filename以參數ex16_sample1.txt
 6 
 7 print "We're going to erase %r." %filename 
 8 print "If you don't want that, hit CTRL-C(^C)."
 9 print "If you do want that, hit RETURN."
10 
11 raw_input("?")
12 
13 print "Opening the file..."
14 target = open(filename,'w') #賦予變量target以ex16_sample1.txt,而且w表示時只寫模式
15 
16 print "Truncating the file, Goodbye!"
17 target.truncate()# 清空文檔target中的內容
18 
19 
20 print "Now I'm going to ask you for three lines."
21 
22 line1 = raw_input("line 1:")# 輸入字符串,用於定義line1
23 line2 = raw_input("line 2:")# 輸入字符串,用於定義line2
24 line3 = raw_input("line 3:")# 輸入字符串,用於定義line3
25 
26 print "I'm going to write these to the file."
27 
28 contxt = "%r \n%r \n%r" %(line1, line2, line3)
29 
30 target.write(contxt) # 將line1寫入target文本中
31 
32 print "And finally, we close it."
33 
34 target.close() #關閉target文本
35 
36 # 是爲了輸出你剛剛寫的txt文檔
37 txt = open(filename, 'r') #文檔必須先被open(),而且將open後的文件賦予變量,而後才能read()這個變量
38 print "Here is the complete txt file you have justed wrote."
39 print "-"*20 #這個命令行,僅僅是爲了終端運行時看起來更清晰
40 print txt.read()
41 txt.close
ex16_3.py

 

   不知道你們有沒有注意到,在這個習題的全部代碼當中,都沒有readline()函數,我在第一次學這個時候,也把這個忽略了,在這裏把它補上。

   我用的是習題15和ex15_sample.txt: 

1 This is stuff I typed into a file.
2 It is really cool stuff.
3 Lots and lots of fun to have in here.
ex15_sample.txt

   我本身又寫了一個腳本ex15_3.py,裏面解釋了4種讀取文本每一行的方法,代碼以下:

 1 #-*-coding:utf-8-*-
 2 
 3 #整行讀取文本的方法
 4 
 5 
 6 from sys import argv
 7 
 8 script_name, file_name = argv
 9 
10 print " I am going to read the file ex15_sample.txt line by line"
11 
12 txt = open(file_name, 'r')
13 L = txt.readlines()
14 
15 #方法1,該方法不徹底正確
16 print L # 讀出的結果是所有的內容,是一個列表,列表的元素個數爲文本的行數                      #['This is stuff I typed into a file.\n', 'It is really cool stuff.\n', 'Lots and lots of fun to have in here.']
17 print "-"*30
18 
19 
20 #方法2 由於上面說過txt.readlines()是一個列表,因此用下面的方法
21 print L[0], L[1], L[2]
22 print "-"*30
23 
24 
25 #方法3
26 for line in open(file_name):
27     print line
28 
29 print "-"*30
30 
31 #方法4
32 txt = open(file_name, 'r')
33 M = txt.readline() #這裏定義變量M,M知識txt中的一句
34 while M: #這是一個死循環,會一直運行這個while語句
35     print M, #輸出打印處一句
36     M = txt.readline() #此處的M實際上是第二次讀取txt裏的第二句,往下循環就是第三次
ex15_3.py

   終端運行結果以下:

   

 

   下面要介紹一下常見的打開方式,我相信你們在看到open(file_name, 'r') 時已經注意到此處的'r'了,它是什麼意思呢?它規定了文件打開的方式

   常見的文件打開方式以下:

   'r': open for reading (default) 默認的只讀模式

   'w': open for wiritting 須要先將文本內容狀況後,才能夠寫!

   'a': open for writting, appending, to the end of the file if it exists 可寫可增長模式,只能寫在文件的末位

   'b': binary mode 二進制式模式

   't': text mode(default) 默認的文本模式

   '+': open a disk for updating (reading and writting)

   'u': universal newline mode(for backwards compatiblity, shouldn't be used in new code)

 

   常見的文件打開方式組合:借用CSDN網站的文檔,其網址爲:https://blog.csdn.net/qq_26442553/article/details/81626442

   

 

--------------------------------------<習題17:複製文本內容>----------------------------------

 

   介紹一個函數:exits(stuff), 若是stuff存在,則該函數反饋True,否者反饋False

   作這個習題,須要先建立兩個新的txt文本,一個是ex17_from_file.txt,其內容本身定義,我寫的以下:

1 'she is so beautiful!' 
2 'she is so kind!' 
3 'she is the one!'
ex17_from_file.txt

   另外一個爲ex17_to_file.txt,其內容爲空白,咱們會經過ex17.py將ex17_from_file.txt的內容複製到ex17_to_file.txt裏。代碼以下:

 1 #-*-coding:utf-8-*-
 2 from sys import argv
 3 from os.path import exists #命令exists是爲了驗證文件是否存在,若是存在,則反饋True,反之False
 4 
 5 script, from_file, to_file = argv
 6 
 7 print "Copying from %s to %s " % (from_file, to_file)
 8 print "\n"
 9 #we could do these two on one line too, how ?
10 #寫成這樣便可取代下面兩行代碼 indata = open(from_flie).read()
11 in_file = open(from_file) # 將from_file.txt打開,並定義稱爲一個變量,命名位in_file
12 indata = in_file.read() #將from_file中的原字符串提取出來,造成一個變量indata
13 
14 print "The original file is :\n"
15 print indata
16 
17 print "The input file is %d bytes long" % len(indata)
18 
19 print "Does the output file exist? %r" % exists(to_file) #如何to_file存在,則exists(to_file)反饋True
20 print "Ready, hit RETURN to continue, CTRL-C to abort."
21 raw_input('?')
22 
23 out_file = open(to_file, 'w') #這個out_file不能夠用read(),由於它的打開方式是w
24 out_file.write(indata)
25 out_file.close()
26 in_file.close()
27 
28 #這是爲了輸出被複制內容的空白文件ex17_to_file.txt
29 new_file = raw_input('file_name:') #在這裏輸入ex17_to_file.txt
30 txt = open(new_file)
31 print "This is editted ex17_to_file.txt"
32 print txt.read()
33 
34 #in_file, out_file, indata 都是中間變量,是爲了可以更加清晰體現程序的原理。
ex17.py

   終端運行結果以下:

   

 

   注意:上面截屏的下方,我用到 bogon:ex neymagico$ cat ex17_to_file.txt,這命令行能夠直接打印文本的內容,所以也能夠上了ex17..py的最後一段代碼。

 

 

 第九章預告:Python裏的函數 

相關文章
相關標籤/搜索