首页 » 父与子的编程之旅:与小卡特一起学Python » 父与子的编程之旅:与小卡特一起学Python全文在线阅读

《父与子的编程之旅:与小卡特一起学Python》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)。这里直接使用了文件名而没有带路径,因为这个文件与使用该文件的程序在同一个文件夹中。

关于路径已经讲得够多了

路径和文件位置就讲到这里。关于文件夹和目录、路径、工作目录等的话题让有的人感觉很迷糊,需要大量篇幅才能解释清楚。不过本书讨论的是编程,而不是操作系统、文件位置或路径,所以如果你在这个方面遇到困难,可以让你的爸爸妈妈、老师或者懂计算机的人来帮你。

本书中所有其他使用文件的例子都将文件放在与程序相同的位置,所以我们不必担心路径或使用完整路径名的问题。