您当前位置: 首页 > 深入 Python > 异常和文件处理 > 处理目录 | << >> | ||||
深入 Python从 Python 新手到专家 |
os.path 模块有几个用于操作文件和目录的函数。在这里,我们将介绍如何处理路径名和列出目录的内容。
>>> import os >>> os.path.join("c:\\music\\ap\\", "mahadeva.mp3")![]()
'c:\\music\\ap\\mahadeva.mp3' >>> os.path.join("c:\\music\\ap", "mahadeva.mp3")
'c:\\music\\ap\\mahadeva.mp3' >>> os.path.expanduser("~")
'c:\\Documents and Settings\\mpilgrim\\My Documents' >>> os.path.join(os.path.expanduser("~"), "Python")
'c:\\Documents and Settings\\mpilgrim\\My Documents\\Python'
![]() |
os.path 是对模块的引用,具体是哪个模块取决于您的平台。就像 getpass 通过将 getpass 设置为特定于平台的函数来封装平台之间的差异一样,os 通过将 path 设置为特定于平台的模块来封装平台之间的差异。 |
![]() |
os.path 的 join 函数从一个或多个部分路径名构造一个路径名。在这种情况下,它只是连接字符串。(请注意,在 Windows 上处理路径名很烦人,因为反斜杠字符必须转义。) |
![]() |
在这个稍微不那么琐碎的例子中,join 会在将路径名连接到文件名之前,在路径名中添加一个额外的反斜杠。当我发现这一点时,我欣喜若狂,因为 addSlashIfNecessary 是我在用一种新语言构建工具箱时总是需要编写的一个愚蠢的小函数。在 Python 中不要 编写这个愚蠢的小函数;聪明的人已经为您处理好了。 |
![]() |
expanduser 将扩展使用 ~ 表示当前用户主目录的路径名。这适用于任何用户具有主目录的平台,如 Windows、UNIX 和 Mac OS X;它对 Mac OS 没有影响。 |
![]() |
结合这些技术,您可以轻松地为用户主目录下的目录和文件构造路径名。 |
>>> os.path.split("c:\\music\\ap\\mahadeva.mp3")('c:\\music\\ap', 'mahadeva.mp3') >>> (filepath, filename) = os.path.split("c:\\music\\ap\\mahadeva.mp3")
>>> filepath
'c:\\music\\ap' >>> filename
'mahadeva.mp3' >>> (shortname, extension) = os.path.splitext(filename)
>>> shortname 'mahadeva' >>> extension '.mp3'
![]() |
split 函数拆分一个完整的路径名,并返回一个包含路径和文件名的元组。还记得我说过您可以使用 多变量赋值 从函数返回多个值吗?嗯,split 就是这样一个函数。 |
![]() |
您将 split 函数的返回值赋给一个由两个变量组成的元组。每个变量接收返回元组中相应元素的值。 |
![]() |
第一个变量 filepath 接收从 split 返回的元组的第一个元素的值,即文件路径。 |
![]() |
第二个变量 filename 接收从 split 返回的元组的第二个元素的值,即文件名。 |
![]() |
os.path 还包含一个函数 splitext,它拆分文件名并返回一个包含文件名和文件扩展名的元组。您可以使用相同的技术将它们分别赋给不同的变量。 |
>>> os.listdir("c:\\music\\_singles\\")['a_time_long_forgotten_con.mp3', 'hellraiser.mp3', 'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3'] >>> dirname = "c:\\" >>> os.listdir(dirname)
['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'cygwin', 'docbook', 'Documents and Settings', 'Incoming', 'Inetpub', 'IO.SYS', 'MSDOS.SYS', 'Music', 'NTDETECT.COM', 'ntldr', 'pagefile.sys', 'Program Files', 'Python20', 'RECYCLER', 'System Volume Information', 'TEMP', 'WINNT'] >>> [f for f in os.listdir(dirname) ... if os.path.isfile(os.path.join(dirname, f))]
['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'IO.SYS', 'MSDOS.SYS', 'NTDETECT.COM', 'ntldr', 'pagefile.sys'] >>> [f for f in os.listdir(dirname) ... if os.path.isdir(os.path.join(dirname, f))]
['cygwin', 'docbook', 'Documents and Settings', 'Incoming', 'Inetpub', 'Music', 'Program Files', 'Python20', 'RECYCLER', 'System Volume Information', 'TEMP', 'WINNT']
![]() |
listdir 函数接受一个路径名,并返回该目录内容的列表。 |
![]() |
listdir 返回文件和文件夹,但不指明哪个是哪个。 |
![]() |
您可以使用 列表过滤 和 os.path 模块的 isfile 函数来区分文件和文件夹。isfile 接受一个路径名,如果该路径表示一个文件,则返回 1,否则返回 0。这里您使用 os.path.join 来确保完整的路径名,但 isfile 也适用于相对于当前工作目录的部分路径。您可以使用 os.getcwd() 获取当前工作目录。 |
![]() |
os.path 还有一个 isdir 函数,如果路径表示一个目录,则返回 1,否则返回 0。您可以使用它来获取目录中子目录的列表。 |
def listDirectory(directory, fileExtList): "get list of file info objects for files of particular extensions" fileList = [os.path.normcase(f) for f in os.listdir(directory)]![]()
fileList = [os.path.join(directory, f) for f in fileList if os.path.splitext(f)[1] in fileExtList]
![]()
![]()
![]() |
|
只要有可能,您就应该使用 os 和 os.path 中的函数来进行文件、目录和路径操作。这些模块是特定于平台的模块的包装器,因此像 os.path.split 这样的函数可以在 UNIX、Windows、Mac OS 以及 Python 支持的任何其他平台上工作。 |
还有另一种方法可以获取目录的内容。它非常强大,并且使用您在命令行工作中可能已经熟悉的通配符。
>>> os.listdir("c:\\music\\_singles\\")['a_time_long_forgotten_con.mp3', 'hellraiser.mp3', 'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3'] >>> import glob >>> glob.glob('c:\\music\\_singles\\*.mp3')
['c:\\music\\_singles\\a_time_long_forgotten_con.mp3', 'c:\\music\\_singles\\hellraiser.mp3', 'c:\\music\\_singles\\kairo.mp3', 'c:\\music\\_singles\\long_way_home1.mp3', 'c:\\music\\_singles\\sidewinder.mp3', 'c:\\music\\_singles\\spinning.mp3'] >>> glob.glob('c:\\music\\_singles\\s*.mp3')
['c:\\music\\_singles\\sidewinder.mp3', 'c:\\music\\_singles\\spinning.mp3'] >>> glob.glob('c:\\music\\*\\*.mp3')
![]()
<< 使用 sys.modules |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
整合所有内容 >> |