iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
Software Development

0基礎也看得懂的程式設計-30天學會 Python系列 第 11

30天學會 Python: Day 10-讀進來!寫出去!

絕對路徑&相對路徑

電腦中所有的檔案和目錄(資料夾)形成一個樹狀的結構
一個目錄下可以有多個目錄和檔案,所有的檔案和目錄由根目錄為起點開始分支

路徑是電腦中用來表示檔案或目錄位置的方法,有兩種表示法:

  • 絕對路徑
    根目錄 開始,某個 檔案目錄 結束的路徑
    Windows 的根目錄是硬碟磁區 (C:\ , D:\ ...),Linux / macOS 的根目錄是 /
    以 Windows 為例:
    • 桌面的絕對路徑是 C:\Users\<使用者名稱>\Desktop
    • 桌面上的相片 dog.jpg 的絕對路徑是 C:\Users\<使用這者名稱>\Desktop\dog.jpg
    • 桌面上的資料夾 catsC:\Users\<使用者名稱>\Desktop\cats
  • 相對路徑
    某檔案或某目錄(資料夾)相對於目前目錄的路徑
    以 Windows 為例,假設桌面上有一個文字檔案 a.txt,和一個資料夾 pictures,資料夾中有三張圖片, dog.jpg, cat.jpg, apple.png,那對桌面這個目錄來說:
    • a.txt 對於桌面的相對路徑是 a.txtpictures 對於桌面的相對路徑是 pictures
    • pictures 中相片對於桌面的相對路徑是 pictures\dog.jpg, pictures\cat.jpgpictures\apple.png

在 Windows,路徑中的目錄以反斜線 \ 分隔,Linux / macOS 以斜線 / 分隔

文字檔案讀寫

變數的數值在程式結束後就會不見,若要將程式執行的結果儲存起來供下次執行時使用,必須將要儲存的資料存在檔案中
Python 中檔案讀寫的功能可以處理各類型的檔案,但純文字類型的處理比較簡單,所以這篇只會介紹文字檔案讀寫

開啟檔案

open(name, mode) 開起檔名是 name 的檔案,可以用相對路徑或絕對路徑表示,參數 mode 是檔案開啟的模式,以字串表示,常用的有:

  • 'r': 唯讀,只能讀取其中的資料
  • 'r+': 讀寫,可以讀取並寫入資料,新寫入的內容會在檔案的開頭
  • w: 寫入,如果檔案不存在會建立新檔案,如果檔案存在原先的內容會被刪除
  • 'a': 寫入,如果檔案不存在會建立新檔案,如果檔案存在不會刪除原先的內容,新的內容會加在檔案的最後

開啟和程式碼檔案同個資料夾中的 data.txt
檔案使用完要用 close() 將檔案關閉以檔案損毀

f = open('data.txt', 'r')
f.close()

或是

with open('data.txt', 'r') as f:

被開啟的檔案會在使用完後自動關閉

讀取檔案

read()

回傳一個字串,包含檔案中的所有內容

先在同個資料夾中建立 data.txt,內容是

Hello, world!!!
Today is the 10th day.

read() 讀取其中的內容

f = open('data.txt', 'r')
contain = f.read()
print(contain)
f.close()

with open('data.txt', 'r') as f:
	contain = f.read()
	print(contain)

可以指定指讀取前幾個字

with open('data.txt', 'r') as f:
	contain = f.read(5)
	print(contain)

readline()

回傳一個字串,是檔案的第一行(包含換行符號)

with open('data.txt', 'r') as f:
	contain = f.readline()
	print(contain)

readlines()

回傳一個串列,裡面的一個元是檔案中的一行

with open('data.txt', 'r') as f:
	contain = f.readlines()
	print(contain)

可以只讀取前幾行

with open('data.txt', 'r') as f:
	contain = f.readlines(1)
	print(contain)

寫入檔案

write() 可以把字串寫入檔案中

如果檔案開啟的模式是 r+,會從檔案的開頭開始寫入,原先的內容會被覆蓋
如果再用 read() 讀取內容,會發現前面幾個字被刪除

with open('data.txt', 'r+') as f:
	f.write('123')
	contain = f.read()
	print(contain)

但實際上檔案的前三個字已經變成123,讓檔案關閉後再讀取一次,才能看到寫入的內容

with open('data.txt', 'r+') as f:
	f.write('123')
with open('data.txt', 'r') as f:
	print(f.read())

如果用 w 模式開啟,原先的內容會先被清空

with open('data.txt', 'w') as f:
	f.write('123')
with open('data.txt', 'r') as f:
	print(f.read())

如果要寫入的檔案不存在時會新增檔案,所以可以搭配迴圈大量且自動的產生檔案

for i in range(1, 6):
	f = open('data_'+str(i)+'.txt', 'w')
	f.close()

如果用 a 模式開啟,原先的內容會保留

with open('data.txt', 'a') as f:
	f.write('123')
with open('data.txt', 'r') as f:
	print(f.read())

應用

因為只能寫入和讀取字串,所以儲存數值時要先把資料轉換成字串
,讀取數值時需要把字串轉成其他型態

從檔案中讀取數值,經過計算後再把數值存回檔案中

with open('data.txt', 'r') as file:
	value=file.read()

value=int(value)
value+=10
value**=2

with open('data.txt', 'w') as file:
	file.write(str(value))

如果檔案中一行只有一個數值,可以用 readlines() 讀取數值,儲存時用迴圈將數值一筆一筆寫入,因為寫入資料時不會自動換行,所以還需要寫入一個 '\n'

with open('data.txt', 'r') as file:
	values=file.readlines()

for i in range(len(values)):
	values[i]=int(values[i])

with open('data.txt', 'w') as file:
	for value in values:
		file.write(str(value))
		file.write('\n')

一行中有多個數值,每個數值用空格或其他符號分隔,可以用字串的 split() 分割字串

如果 data.txt 長這樣

123 23 456 3 45

那讀取和寫入時可以寫成

with open('data.txt', 'r') as file:
	values=file.read()

values = values.split()
for i in range(len(values)):
	values[i]=int(values[i])

with open('data.txt', 'w') as file:
	for value in values:
		file.write(str(value))
		file.write(' ')

上一篇
30天學會Python: Day 9- 程式碼也能取名字
下一篇
30天學會 Python: Day 11- 一個蘿蔔一個坑
系列文
0基礎也看得懂的程式設計-30天學會 Python30

尚未有邦友留言

立即登入留言