2020年9月15日星期二

[課後作業] 第028講:文件:因為懂你,所以永恆|課後測試題及答案

[課後作業] 第028講:文件:因為懂你,所以永恆|課後測試題及答案




《零基礎入門學習Python》視頻下載地址:傳送門
   
測試題:

0.下邊只有一種方式不能打開文件,請問是哪一種,為什麼?

  1. >>> f = open('E:/test.txt', 'w') # A
  2. >>> f = open('E:\test.txt', 'w') # B
  3. >>> f = open('E://test.txt', 'w') # C
  4. >>> f = open('E:\\test.txt', 'w') # D
複製代碼


1.打開一個文件我們使用open()函數,通過設置文件的打開模式,決定打開的文件具有那些性質,請問默認的打開模式是什麼呢?


2.請問>>> open('E:\\Test.bin', 'xb')是以什麼樣的模式打開文件的?


3.儘管Python有所謂的“垃圾回收機制”,但對於打開了的文件,在不需要用到的時候我們仍然需要使用f.close()將文件對象“關閉”,這是為什麼呢?


4.如何將一個文件對象(f)中的數據存放進列表中?


5.如何迭代打印出文件對象(f)中的每一行數據?


6.文件對象的內置方法f.read([size=-1])作用是讀取文件對象內容,size參數是可選的,那如果設置了size=10,例如f.read(10),將返回什麼內容呢?


7.如何獲得文件對象(f)當前文件指針的位置?


8.還是視頻中的那個演示文件(record.txt),請問為何f.seek(45, 0)不會出錯,但f.seek(46)就出錯了呢?

  1. >>> f.seek(46)
  2. 46
  3. >>> f.readline()
  4. Traceback (most recent call last):
  5.   File "<pyshell#18>", line 1, in <module>
  6.     f.readline()
  7. UnicodeDecodeError: 'gbk' codec can't decode byte 0xe3 in position 4: illegal multibyte sequence
複製代碼


動動手:

0.嘗試將文件(  OpenMe.mp3 (700 Bytes,下載次數: 6117) )打印到屏幕上


1.編寫代碼,將上一題中的文件(OpenMe.mp3)保存為新文件(OpenMe.txt)



3.請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

回复您的答案即可查看參考答案!


測試題答案:

本帖隱藏的內容

0. 下邊只有一種方式不能打開文件,請問是哪一種,為什麼?
  1. >>> f = open('E:/test.txt', 'w') # A
  2. >>> f = open('E:\test.txt', 'w') # B
  3. >>> f = open('E://test.txt', 'w') # C
  4. >>> f = open('E:\\test.txt', 'w') # D
複製代碼

答:B不能打開文件。

Windows在路徑名中既可以接受斜線(/)也可以接受反斜線(\),不過如果使用反斜線作為路徑名的分隔符的話,要注意使用雙反斜線(\\)進行轉義,否則Python會將反斜線進行轉義,例如(\n)看成一個換行符,(\t)看作一個製表符等。


1.打開一個文件我們使用open()函數,通過設置文件的打開模式,決定打開的文件具有那些性質,請問默認的打開模式是什麼呢?

答:open()函數默認的打開模式是'rt',即可讀、文本的模式打開。


2.請問>>> open('E:\\Test.bin', 'xb')是以什麼樣的模式打開文件的?

答:以“可寫入以及二進制模式”打開文件“E:\\Test.bin”。

這裡要注意的是'x'和'w'均是以“可寫入”的模式打開文件,但以'x'模式打開的時候,如果路徑下已經存在相同的文件名,會拋出異常,而'w'模式的話會直接覆蓋同名文件。

因此,'w'模式打開文件會比較危險,容易導致此前的內容遺失,因此使用'w'模式打開文件前先檢查該文件名是否已經存在顯得非常重要!下節課小甲魚會教你如何安全的打開一個文件^_^


3.儘管Python有所謂的“垃圾回收機制”,但對於打開了的文件,在不需要用到的時候我們仍然需要使用f. close()將文件對象“關閉”,這是為什麼呢?

答:Python擁有垃圾收集機制,會在文件對象的引用計數降至零的時候自動關閉文件,所以在Python編程裡,如果忘記關閉文件並不會造成內存洩漏那麼危險。

但並不是說就可以不要關閉文件,如果你對文件進行了寫入操作,那麼你應該在完成寫入之後進行關閉文件。因為Python可能會緩存你寫入的數據,如果這中間斷電了神馬的,那些緩存的數據根本就不會寫入到文件中。所以,為了安全起見,要養成使用完文件後立刻關閉的優雅習慣。


4.如何將一個文件對象(f)中的數據存放進列表中?

答:list(f),是不是非常的方便!


5.如何迭代打印出文件對象(f)中的每一行數據?

答:直接使用for語句把文件對象迭代出來即可:
  1. for each_line in f:
  2.         print(each_line)
複製代碼


6.文件對象的內置方法f.read([size=-1])作用是讀取文件對象內容,size參數是可選的,那如果設置了size=10,例如f.read(10),將返回什麼內容呢?

答:將返回從文件指針開始(注意這裡並不是文件頭哦)的連續10個字符。


7.如何獲得文件對象(f)當前文件指針的位置?

答:f.tell()會告訴你^_^


8.還是視頻中的那個演示文件(record.txt),請問為何f.seek(45, 0)不會出錯,但f.seek(46)就出錯了呢?
  1. >>> f.seek(46)
  2. 46
  3. >>> f.readline()
  4. Traceback (most recent call last):
  5.   File "<pyshell#18>", line 1, in <module>
  6.     f.readline()
  7. UnicodeDecodeError: 'gbk' codec can't decode byte 0xe3 in position 4: illegal multibyte sequence
複製代碼

答:因為使用f.seek()定位的文件指針是按字節為單位進行計算的,演示文件(record.txt)是以GBK進行編碼的,按照規則,一個漢字需要佔用兩個字節,f .seek(45)的位置位於字符“小”的開始位置,因此可以正常打印,而f.seek(46)的位置剛好位於字符“小”的中間位置,因此按照GBK編碼的形式無法將其解碼!




動動手答案:

本帖隱藏的內容

0.嘗試將文件(OpenMe.mp3)打印到屏幕上

答:直接使用打開文本文件的形式打開即可,至於為什麼?打開後會告訴你@_@
  1. f = open('OpenMe.mp3')
  2. for each_line in f:
  3.         print(each_line, end='')
  4. f.close()
複製代碼



1.編寫代碼,將上一題中的文件(OpenMe.mp3)保存為新文件(OpenMe.txt)

答:
  1. f1 = open('OpenMe.mp3')
  2. f2 = open('OpenMe.txt', 'x') # 使用”x”打開更安全
  3. f2.write(f1.read())
  4. f2.close()
  5. f1.close()
複製代碼


2.請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

小甲魚希望你認真對待作業就像你希望小甲魚推出高質量視頻一樣渴望^_^

文件打開模式
打開模式執行操作
'r'以只讀方式打開文件(默認)
'w'以寫入的方式打開文件,會覆蓋已存在的文件
'x'如果文件已經存在,使用此模式打開將引發異常
'a'以寫入模式打開,如果文件存在,則在末尾追加寫入
'b'以二進制模式打開文件
't'以文本模式打開(默認)
'+'可讀寫模式(可添加到其他模式中使用)
'U'通用換行符支持
文件對象方法
文件對象方法執行操作
f.close()關閉文件
f.read([size=-1])從文件讀取size個字符,當未給定size或給定負值的時候,讀取剩餘的所有字符,然後作為字符串返回
f.readline([size=-1])從文件中讀取並返回一行(包括行結束符),如果有size有定義則返回size個字符
f.write(str)將字符串str寫入文件
f.writelines(seq)向文件寫入字符串序列seq,seq應該是一個返回字符串的可迭代對象
f.seek(offset, from)在文件中移動文件指針,從from(0代表文件起始位置,1代表當前位置,2代表文件末尾)偏移offset個字節
f.tell()返回當前在文件中的位置
f.truncate([size=file.tell()])截取文件到size個字節,默認是截取到文件指針當前位置




0 留言:

發佈留言