首页 » 与孩子一起学编程 » 与孩子一起学编程全文在线阅读

《与孩子一起学编程》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 分支向下移到 HelloWorld 分支。你的当前位置或当前目录就是 c:/Program Files/HelloWorld。

现在要找到文件 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)。这里直接使用了文件名而没有带路径,因为这个文件与使用该文件的程序在同一个文件夹中。

关于路径已经讲得够多了

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

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