|
发表于 2024-11-4 11:32:28
|
显示全部楼层
0. 不會,會建立一個新的檔案
1.用flush()
2.
讀取size個字元,在這裡也就是讀取3個字元
3.
一行,因為沒有手動\n
4.請問在課堂中的代碼,為什麼我們寫入的時候只有一個換行符號,但是使用 for 迴圈讀取並打印出來卻多了一個空白行呢?
f = open("FishC.txt", "w")
f.writelines(["I love FishC.\n", "I love my wife."])
f.close()
f = open("FishC.txt", "r")
for each in f:
print(each)
輸出:
I love FishC.
I love my wife.
答:
當你在寫入檔案時,使用了 "\n" 作為換行符號:
f.writelines(["I love FishC.\n", "I love my wife."])
這表示在 "I love FishC." 之後會有一個換行。然而,當你使用 print() 函數來輸出每一行時,print() 本身也會自動添加一個換行符號。因此,最終在顯示時,每行之後會出現兩個換行符號,導致中間出現一個空白行。
解決方法:
如果你不希望出現多餘的空白行,可以在寫入檔案時移除手動添加的換行符號,或在 print() 函數中使用 end='':
5.
C:\Users\goodb\Desktop\FishC
這段會把\當成跳脫字元來處理,所以就無法解碼
編譯器將路徑中的 C:\Users\的\U視為Unicode-Escape編碼的跳脫字元,因此\U被當成Unicode Code字串的起點,依照定義後面必需接8位數字 (ex. \U01000001) 來Decode,在此後面接了一串字母,因此產生Decode失敗的錯誤訊息。
要在前面寫r或是把\改成\\
6. 小心不要把前面的內容覆蓋了
7.可以,檔案存在的話會在末尾追加
8.
指向檔案當下的位置。在檔案中讀取一個字元時,檔案指標會指向下一個字元
9. end of the file
檔案末尾
10.
使用tell()方法
動手:
請下載檔案(FishC.txt(25 位元組,下載次數:962)),編寫程式碼,截取其中第 10 至 15 個字元,並儲存為新檔案(FishD.txt)。
0.
with open("FishC.txt", "r") as f:
content = f.seek(10)
content = f.read(15)
with open("FishD.txt", "w") as FishD:
FishD.write(content)
GPT改:
移除不必要的賦值:
seek() 方法的返回值(新的指標位置)通常不需要使用,因此可以直接呼叫 f.seek(10) 而不必將其賦值給 content。
所以要給小甲魚的版本應該是:
f = open("FishC.txt", "r")
f.seek(10)
content = f.read(15)
FishE = open("FishE.txt", "w")
FishE.write(content)
f.close()
*
請介紹with語句
with 語句是一種用來簡化資源管理(如檔案操作、網路連線等)的結構。它能自動處理資源的開啟與關閉,確保資源在使用完畢後能正確釋放,無需手動調用關閉方法(如 close())
基本語法
with 表達式 [as 變數]:
程式區塊
在檔案操作中,最常見的用法是使用 with 來開啟檔案,並自動管理檔案的關閉:
with open("example.txt", "r") as f:
content = f.read()
print(content)
# 檔案在此處自動關閉
自動管理資源:
with 語句會自動處理資源的釋放,即使在程式區塊中發生異常,也能確保資源被正確釋放。
例如,在檔案操作中,無論 read() 或 write() 方法是否成功執行,檔案都會自動關閉。
更好的錯誤處理:
在傳統方法中,需要使用 try...finally 結構來確保資源被釋放,這增加了程式碼的複雜性。
使用 with 語句則自動處理,讓錯誤處理更為優雅。
傳統賦值給變數的做法,如果忘記調用 f.close(),可能導致資源洩漏。且需要手動處理異常
*
在 Python 的檔案操作中,若要將一個檔案另存成不同的檔名,可以使用以下幾種方法:
1.使用 shutil 模組的 copy 或 copyfile 方法
import shutil
# 複製檔案並另存為不同檔名
source = "original_file.txt"
destination = "copied_file.txt"
shutil.copy(source, destination)
print(f"檔案已成功複製為 {destination}")
或使用 shutil.copyfile
import shutil
# 僅複製檔案內容
source = "original_file.txt"
destination = "copied_file.txt"
shutil.copyfile(source, destination)
print(f"檔案內容已成功複製到 {destination}")
*
shutil.copy 除了複製內容,還會複製檔案的權限等資訊。
shutil.copyfile 僅複製檔案內容,不會複製權限等其他資訊。
目標檔案 (destination) 必須是檔案名稱,不能是目錄名稱。
2.使用 os 模組的 rename 方法
如果只是想更改檔案的名稱或移動檔案到另一個目錄,可以使用 os.rename 方法。這個方法會直接更改原檔案的名稱或位置,而不是創建一個新的副本。
import os
# 原檔案名稱
original = "original_file.txt"
# 新檔案名稱
new_name = "renamed_file.txt"
os.rename(original, new_name)
print(f"檔案已重新命名為 {new_name}")
加上移動檔案功能
import os
# 原檔案路徑
original = "original_file.txt"
# 目標目錄及新檔名
destination = "backup/renamed_file.txt"
os.rename(original, destination)
print(f"檔案已移動並重新命名為 {destination}")
os.rename 不會複製檔案,而是直接移動或更改名稱。
如果目標路徑已存在檔案,可能會覆蓋該檔案,請小心使用。
3.手動讀取並寫入檔案內容
# 讀取原檔案內容
with open("original_file.txt", "r", encoding="utf-8") as original_file:
content = original_file.read()
# 寫入到新檔案
with open("new_file.txt", "w", encoding="utf-8") as new_file:
new_file.write(content)
print("檔案已成功另存為 new_file.txt")
優點:
可以在複製過程中對檔案內容進行處理或修改。
缺點:
相較於使用 shutil,這種方法較為繁瑣,且在處理大型檔案時效率較低。
1.
f = open("FishC.txt", "r+")
f.seek(0)
f.truncate(15)
f.close()
記得r要改成可以寫入的r+
2.
請編寫一個源代碼(open_myself.py),其功能就是打開自己的源檔案,然後打印出來。
答1:
f = open("open_myself.py", "r")
data = f.readlines()
print(data)
f.close()
印出格式不理想:
說明:print(data) 會直接打印出一個列表,其中包含每一行的字串及其換行符號,顯示效果可能不如預期。
解決方法:使用迴圈逐行打印,或將列表轉換為單一字串後再打印,以獲得更整潔的輸出格式。
要測試要開cmd用cd移動到目錄後打開才會印出
遇到錯誤:
file "open_myself.py" line 3 in <module>
data = f.readlines()
UnicodeDecodeError: 'cp950' codec can't decode byte 0xe9 in position 40: illegal multibyte sequence
理由:
檔案編碼與讀取編碼不一致:
您的 open_myself.py 檔案可能是使用 UTF-8 或其他編碼格式儲存的,但 Python 嘗試使用 'cp950' 編碼來讀取。
如果檔案中包含 'cp950' 無法識別的特殊字元(如某些 Unicode 字元),就會導致 UnicodeDecodeError。
解決方法
要解決這個問題,您可以明確指定檔案的編碼格式為 UTF-8(或您實際使用的編碼格式)來讀取檔案。
再在open加上, encoding="utf-8"就可以成功印出繁中了
3.
在圖片中隱藏檔案(又稱圖片隱寫術)的原理及實現
需求:
在日常生活中,我們可能需要將一些小檔案隱藏起來,比如將種子檔案隱藏到封面圖片中,這樣只需提供圖片,通過解密即可得到相應的種子檔案。這項技術稱為圖片隱寫術。
原理:
這個方法很簡單,只需將壓縮檔案的內容直接追加寫入到圖片檔案的尾部即可。
舉例:
假設我們有一個圖片檔案和一個壓縮檔案如下:
我們編寫代碼,打開這兩個檔案,並將壓縮檔案的所有內容追加到 test.jpg 檔案的尾部。得到的 test.jpg 圖片就是兩個檔案合併的結果,此時圖片依然可以正常打開:
然而,這個圖片檔案已經被我們修改過了,只要將 test.jpg 的檔案名修改為 test.zip,那麼我們就得到了一个隱藏的壓縮檔案。
要求:
下載素材包hw.zip,裡面包含圖片檔案(test.jpg)和壓縮檔案(target.zip),編寫代碼將壓縮檔案的內容寫入到圖片檔案的尾部,從而實現壓縮檔案的隱藏。
答1:
f = open("test.jpg", "a", encoding="iso-8859-1")
fzip = open("target.zip", "r", encoding="iso-8859-1")
data = fzip.readlines()
for each in data:
f.write(each)
f.close()
fzip.close()
GPT
以文字模式開啟二進位文件:
問題:test.jpg 和 target.zip 都是二進位文件,應該以二進位模式 ('ab' 和 'rb') 開啟,而不是文字模式 ('a' 和 'r')。
影響:以文字模式開啟二進位文件可能會導致資料損壞,尤其是在處理包含特殊字元或非ASCII字元的情況下。
指定不適當的編碼:
問題:使用 encoding="iso-8859-1" 來讀寫二進位文件是不正確的,應該直接以二進位模式處理,無需指定編碼。
影響:指定編碼會導致 Python 嘗試將字節轉換為字串,這在處理純二進位資料時會引發錯誤或資料損壞。
使用 readlines() 處理二進位資料:
問題:readlines() 方法是用於讀取文字文件的,它會根據換行符號分割資料。對於二進位文件,這種分割方式不適用。
影響:可能導致資料被錯誤地分割和寫入,從而損壞最終的圖片文件。
最終修改:
f = open("test.jpg", "ab")
fzip = open("target.zip", "rb")
data = fzip.read()
f.write(data)
f.close()
fzip.close() |
|