讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 22.3 文件位置 >

22.3 文件位置

到目前為止,我們一直在處理與程序存儲在相同位置上的文件。我們沒有考慮如何查找文件,因為它與程序在同一個地方。

這就像你在自己的房間裡時,你不用擔心找不到你的壁櫥,它就在房間裡。但是如果你在另一個房間、另一幢房子或者在另一個城市裡,要找到壁櫥就複雜多了!

每個文件都要存儲在某個地方,所以除了文件名外,每個文件還有自己的位置。硬盤和其他存儲介質都組織為文件夾或目錄。文件夾(folder)和目錄(directorie)表示的是同一樣東西,只是名字不同而已。它們是一種組織文件的方法。文件夾或目錄組織和關聯的方式稱為文件夾結構或目錄結構。

在 Windows 中,每個存儲介質由一個字母表示,如C代表硬盤,E 對應一個閃存盤。在 Mac OS X 和 Linux 上,每個存儲介質都有一個名字(例如,hda 或 FLASH DRIVE)。每個存儲單元可以劃分為多個文件夾,如 Music、Pictures 和 Programs。如果查看文件瀏覽器(如 Windows Explorer),就像下圖這樣:

文件夾中還可以有其他文件夾,這些文件夾本身又可以包含另外的文件夾,依此類推。下邊這個例子包含了 3 層文件夾:

第一層是 Music,下一層包含 New Music 和 Old Music,再下一層包含 Kind of old music 和 Really old music。

術語箱

位於其他文件夾中的文件夾稱為子文件夾(subfolder)。如果使用術語「目錄」來描述,可以把它們稱為子目錄(subdirectory)。

在 Windows Explorer(或其他文件瀏覽器)中查找文件或文件夾時,文件夾就像一棵樹的分支。「根」是驅動器本身,如 C: 或 E:。每個主文件夾就像樹幹,各個主文件夾中的文件夾則像小樹枝,依此類推。

不過,從程序訪問文件時,這種樹型想法就不適用了。你的程序不能點擊文件夾,不能通過瀏覽整棵樹來查找某個文件,它需要一種更直接的方法來查找文件。好在還有另外一種方法可以表示樹結構。點擊不同文件夾和子文件夾時,如果你查看 Windows Explorer 的地址欄,你會看到這樣的地址:

E:MusicOld MusicReally old musicmy_song.mp3  

這稱為路徑(path),描述了文件在文件夾結構中的位置。

這個特定的路徑表達的意思如下:

1. 從 E: 盤開始;

2. 進入名為 Music 的文件夾;

3. 在 Music 文件夾中,進入一個名為 Old Music 的子文件夾;

4. 在 Old Music 子文件夾中,進入下一層一個名為 Really old music 的子文件夾;

5. 在 Really old music 子文件夾中,有一個名為 my_song.mp3 的文件。

可以使用類似這樣的路徑找到計算機上的任何文件。程序就是利用這種方法來查找和打開文件的。下面是一個例子:

image_file = \"c:/program files/HelloWorld/examples/beachball.png\"  

使用文件的完全路徑名總能找到文件。完全路徑名包含從根(驅動器,如 C:)開始這個路徑上的所有文件夾名。這個例子中的文件名就是一個完全路徑名。

斜線還是反斜線

斜線( 和 /)一定要正確使用,這很重要。Windows 在路徑名中可以接受斜線 (/) 也可以接受反斜線(),不過如果在 Python 程序中使用類似 c:test_results.txt 的路徑,t 部分會帶來問題。還記得嗎?在第 21 章中,我們談到過一些用於打印格式化的特殊字符,如 t 表示製表符。正是因為這個原因,所以應當避免在文件路徑中出現 字符。Python(和 Windows)會把 t 看作是一個製表符,而不是像你預想的那樣把它當作文件名的一部分。所以應當使用 /。

另一種選擇是使用雙反斜線,如下:

image_file \"c:\\program files\\HelloWorld\\images\\beachball.png\"  

記住,如果希望打印一個 符號,必須在它前面再放一個反斜線。在文件名中也是如此。不過我還是推薦使用 /。

有時並不需要完整的文件路徑。下一節將討論如何在「半路上」查找一個文件。

看看你在哪裡

大多數操作系統(包括 Windows)都有一個「工作目錄」概念,有時也稱為「當前工作目錄」,這是文件夾樹中你目前所在的目錄。

假設從根(C:)開始,沿著 Program Files 分支向下移到 Hello World 分支。你的當前位置或當前目錄就是 C:/Program Files/Hello World。

現在要找到文件 beachball.png,必須沿 Examples 分支向下。所以達到這個文件的路徑就是 /Examples/beachball.png。由於你已經在這條路上走了一段,所以只需要走完剩下的一段就能到達你想去的地方。

還記得嗎?在第 19 章講到關於聲音的內容時,我們打開聲音文件使用的是 splat.wav 之類的文件名,並沒有使用路徑。這是因為,那時我告訴你要把聲音文件複製到保存程序的同一個文件夾中。如果在 Windows Explorer 中查看,就是這樣:

注意,我把 Python 文件(擴展名為 .py)與聲音文件(擴展名為 .wav)放在同一個文件夾中。運行 Python 程序時,它的工作目錄就是存儲 .py 文件的文件夾。

如果把程序存儲在 e:/programs 並運行,這個程序就會把 e:/programs 作為它的工作目錄開始運行。如果有一個聲音文件存儲在同一個文件夾中,那麼程序只需要它的文件名就可以打開這個聲音文件。並不需要一個路徑來找到這個文件,因為文件已經在當前位置上了,所以可以直接這樣寫:

my_sound = pygame.mixer.Sound(\"splat.wav\")  

注意,我們不需要使用聲音文件的完全路徑名(它的完全路徑名是 e:/programs/splat.wav)。這裡直接使用了文件名而沒有帶路徑,因為這個文件與使用該文件的程序在同一個文件夾中。

關於路徑已經講得夠多了

路徑和文件位置就講到這裡。關於文件夾和目錄、路徑、工作目錄等的話題讓有的人感覺很迷糊,需要大量篇幅才能解釋清楚。不過本書討論的是編程,而不是操作系統、文件位置或路徑,所以如果你在這個方面遇到困難,可以讓你的爸爸媽媽、老師或者懂計算機的人來幫你。

本書中所有其他使用文件的例子都將文件放在與程序相同的位置,所以我們不必擔心路徑或使用完整路徑名的問題。