第16章-操作系统模块

这个 os 模块有很多用途。我们不会把它所能做的都包括在内。相反,我们将获得它的使用概述,我们还将查看它的一个子模块,即 os.path .具体来说,我们将涵盖以下内容:

  • os.name

  • os.environ

  • os.chdir()。

  • os.getcwd()。

  • os.getenv()。

  • os.putenv()操作系统

  • 操作系统.mkdir()

  • os.makedirs()。

  • os.remove()。

  • os.rename()。

  • 操作系统.rmdir()

  • 操作系统.startfile())

  • 操作系统.walk()。

  • os.path

这看起来要涵盖很多内容,但操作系统模块可以完成的其他操作至少是10倍。这一章只是给你一点可用的体验。要使用本节中提到的任何方法,您需要导入 os 模块,如下所示:

import os

让我们开始学习如何使用此模块!

os.name

操作系统模块具有可调用函数和正常值。如果是 os.name ,它只是一个值。当您访问os.name时,您将获得有关正在运行的平台的信息。您将收到下列值之一:“POSIX”、“NT”、“OS2”、“CE”、“Java”、“RISCOS”。让我们看看在Windows7上运行它会得到什么:

>>> import os
>>> os.name
'nt'

这告诉我们,我们的python实例运行在一个Windows框中。我们怎么知道的?因为微软早在几年前就开始将其操作系统命名为NT。例如,Windows7也被称为WindowsNT6.1。

os.environ、os.getenv()和os.putenv()。

这个 os.environ 值称为 映射 对象,返回用户环境变量的字典。您可能不知道这一点,但每次使用计算机时,都会设置一些环境变量。这些可以为您提供有价值的信息,例如处理器数量、CPU类型、计算机名称等。让我们看看我们可以从我们的机器中找到什么:

>>> import os
>>> os.environ
{'ALLUSERSPROFILE': 'C:\\ProgramData',
 'APPDATA': 'C:\\Users\\mike\\AppData\\Roaming',
 'CLASSPATH': '.;C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip',
 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',
 'COMPUTERNAME': 'MIKE-PC',
 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe',
 'FP_NO_HOST_CHECK': 'NO',
 'HOMEDRIVE': 'C:',
 'HOMEPATH': '\\Users\\mike',
 'LOCALAPPDATA': 'C:\\Users\\mike\\AppData\\Local',
 'LOGONSERVER': '\\\\MIKE-PC',
 'NUMBER_OF_PROCESSORS': '2',
 'OS': 'Windows_NT',
 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
 'PROCESSOR_ARCHITECTURE': 'x86',
 'PROCESSOR_IDENTIFIER': 'x86 Family 6 Model 15 Stepping 13, GenuineIntel',
 'PROCESSOR_LEVEL': '6',
 'PROGRAMDATA': 'C:\\ProgramData',
 'PROGRAMFILES': 'C:\\Program Files',
 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\',
 'PUBLIC': 'C:\\Users\\Public',
 'PYTHONIOENCODING': 'cp437',
 'QTJAVA': 'C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip',
 'SESSIONNAME': 'Console',
 'SYSTEMDRIVE': 'C:',
 'SYSTEMROOT': 'C:\\Windows',
 'TEMP': 'C:\\Users\\mike\\AppData\\Local\\Temp',
 'TMP': 'C:\\Users\\mike\\AppData\\Local\\Temp',
 'USERDOMAIN': 'mike-PC',
 'USERNAME': 'mike',
 'USERPROFILE': 'C:\\Users\\mike',
 'VBOX_INSTALL_PATH': 'C:\\Program Files\\Oracle\\VirtualBox\\',
 'VS90COMNTOOLS': 'C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\Tools\\',
 'WINDIR': 'C:\\Windows',
 'WINDOWS_TRACING_FLAGS': '3',
 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log',
 'WINGDB_ACTIVE': '1',
 'WINGDB_PYTHON': 'c:\\python27\\python.exe',
 'WINGDB_SPAWNCOOKIE': 'rvlxwsGdD7SHYIJm'}

你的输出不会和我的一样,因为每个人的电脑配置都有点不同,但你会看到类似的东西。正如您可能注意到的,这返回了一本字典。这意味着您可以使用普通字典方法访问环境变量。下面是一个例子:

>>> print(os.environ["TMP"])
'C:\\Users\\mike\\AppData\\Local\\Temp'

您也可以使用 os.getenv 访问此环境变量的函数:

>>> os.getenv("TMP")
'C:\\Users\\mike\\AppData\\Local\\Temp'

使用os.getenv()而不是os.environ字典的好处是,如果您碰巧尝试访问不存在的环境变量,getenv函数将只返回none。如果对os.environ执行相同的操作,则会收到一个错误。让我们试试看,看看会发生什么:

>>> os.environ["TMP2"]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    os.environ["TMP2"]
  File "C:\Python27\lib\os.py", line 423, in __getitem__
    return self.data[key.upper()]
KeyError: 'TMP2'

>>> print(os.getenv("TMP2"))
None

os.chdir()和os.getcwd()。

这个 os.chdir 函数允许我们更改当前运行python会话的目录。如果你想知道你现在在哪条路上,你可以打电话给 os.getcwd()。 .让我们一起尝试一下:

>>> os.getcwd()
'C:\\Python27'
>>> os.chdir(r"c:\Users\mike\Documents")
>>> os.getcwd()
'c:\\Users\\mike\\Documents'

上面的代码向我们展示了当我们在 IDLE 状态下运行这个代码时,我们默认从python目录开始。然后我们用 os.chdir()。 .最后,我们再次调用os.getcwd()以确保成功地更改到文件夹。

os.mkdir()和os.makedirs()。

您可能已经猜到了,但是本节中介绍的两种方法用于创建目录。第一个是 操作系统.mkdir() ,这允许我们创建一个文件夹。让我们试试看:

>>> os.mkdir("test")
>>> path = r'C:\Users\mike\Documents\pytest'
>>> os.mkdir(path)

第一行代码将创建一个名为 test 在当前目录中。如果您忘记了,可以使用前一节中的方法来确定刚刚运行代码的位置。第二个例子为变量分配了一个路径,然后我们将该路径传递给os.mkdir()。这允许您在系统上任何有权限的地方创建一个文件夹。

这个 os.makedirs()。 函数将在路径中创建所有中间文件夹(如果它们不存在)。基本上,这意味着您可以创建一个包含嵌套文件夹的路径。当我创建一个带有日期的文件夹结构的日志文件(比如年/月/日)时,我发现自己经常这样做。让我们来看一个例子:

>>> path = r'C:\Users\mike\Documents\pytest\2014\02\19'
>>> os.makedirs(path)

这里发生了什么?这段代码刚刚创建了一堆文件夹!如果你还有 脓包 文件夹在您的系统中,然后它只添加了一个 2014 文件夹中包含另一个文件夹,其中也包含一个文件夹。在您的系统上使用有效的路径为您自己尝试一下。

os.remove()和os.rmdir()。

这个 os.remove()。操作系统.rmdir() 函数分别用于删除文件和目录。让我们来看一个 os.remove()。

>>> os.remove("test.txt")

此代码段将尝试删除名为 test.txt 从当前工作目录。如果找不到文件,您可能会收到某种错误。如果文件正在使用(即锁定),或者您没有删除该文件的权限,您也将收到一个错误。您可能还想退房 os.unlink 做同样的事。术语 取消链接 是此过程的传统Unix名称。

现在让我们来看一个 操作系统.rmdir()

>>> os.rmdir("pytest")

上面的代码将尝试删除名为 脓包 从当前工作目录。如果成功,您将看到该目录不再存在。如果目录不存在、您没有删除该目录的权限或目录不为空,则会引发错误。你可能还想看看 os.removedirs()删除 它可以递归地删除嵌套的空目录。

os.rename(src,dst)

这个 os.rename()。 函数将重命名文件或文件夹。让我们来看一个重命名文件的示例:

>>> os.rename("test.txt", "pytest.txt")

在这个例子中,我们告诉您 os.rename 重命名名为的文件 test.txtpytest.txt .这发生在我们当前的工作目录中。如果尝试重命名不存在的文件或您没有正确的权限重命名该文件,则会出现错误。

还有一个 os.renames 递归重命名目录或文件的函数。

操作系统.startfile())

这个 操作系统.startfile()) 方法允许我们用相关程序“启动”一个文件。换句话说,我们可以打开一个与它相关的程序的文件,就像双击一个PDF并在AdobeReader中打开一样。让我们试试看!

>>> os.startfile(r'C:\Users\mike\Documents\labels.pdf')

在上面的示例中,我将一条完全限定的路径传递给 os.startfile 告诉它打开一个名为 labels.pdf .在我的机器上,这将在AdobeReader中打开PDF。您应该尝试使用此方法打开自己的PDF、MP3和照片,以了解其工作原理。

操作系统.walk()。

这个 操作系统.walk()。 方法为我们提供了一种迭代根级路径的方法。这意味着我们可以将路径传递给这个函数,并访问它的所有子目录和文件。让我们使用其中一个python文件夹来测试这个函数。我们将使用:c:\python27\tools

>>> path = r'C:\Python27\Tools'
>>> for root, dirs, files in os.walk(path):
        print(root)

C:\Python27\Tools
C:\Python27\Tools\i18n
C:\Python27\Tools\pynche
C:\Python27\Tools\pynche\X
C:\Python27\Tools\Scripts
C:\Python27\Tools\versioncheck
C:\Python27\Tools\webchecker

如果需要,还可以循环 dirs文件夹 也一样。有一种方法可以做到:

>>> for root, dirs, files in os.walk(path):
        print(root)
        for _dir in dirs:
            print(_dir)
        for _file in files:
            print(_file)

这段代码会打印出很多东西,所以我不会在这里显示它的输出,但是可以尝试一下。现在我们准备好学习如何使用路径了!

os.path

这个 os.path 的子模块 os 模块内置了很多功能。我们将研究以下功能:

  • 基名

  • 目录名

  • 存在

  • ISdir和ISfile

  • 参加

  • 分裂

此子模块中还有许多其他功能。欢迎您阅读第10.1节的python文档中的相关内容。

os.path.basename

这个 基名 函数只返回路径的文件名。下面是一个例子:

>>> os.path.basename(r'C:\Python27\Tools\pynche\ChipViewer.py')
'ChipViewer.py'

每当需要使用文件名命名某些相关文件(如日志文件)时,我都会发现这一点很有用。这在我处理数据文件时经常发生。

os.path.dirname

这个 目录名 函数将只返回路径的目录部分。如果我们看一下一些代码,会更容易理解:

>>> os.path.dirname(r'C:\Python27\Tools\pynche\ChipViewer.py')
'C:\\Python27\\Tools\\pynche'

在这个例子中,我们只需要返回目录路径。当您希望将其他文件存储在正在处理的文件旁边时,这也很有用,如前面提到的日志文件。

os.path.exists

这个 存在 函数将告诉您路径是否存在。你所要做的就是给它一条路。让我们看看:

>>> os.path.exists(r'C:\Python27\Tools\pynche\ChipViewer.py')
True
>>> os.path.exists(r'C:\Python27\Tools\pynche\fake.py')
False

在第一个示例中,我们通过 存在 函数一个实路径,它返回 True 这意味着路径存在。在第二个例子中,我们给它传递了一条错误的路径,它告诉我们路径不存在,返回 .

os.path.isdir/os.path.isfile文件

这个 ISDIRISF文件 方法与 存在 方法,因为它们也测试存在性。然而, ISDIR 仅检查路径是否为目录并且 ISF文件 仅检查路径是否为文件。如果您想检查路径是否存在,不管它是文件还是目录,那么您需要使用 存在 方法。无论如何,让我们研究一些例子:

>>> os.path.isfile(r'C:\Python27\Tools\pynche\ChipViewer.py')
True
>>> os.path.isdir(r'C:\Python27\Tools\pynche\ChipViewer.py')
False
>>> os.path.isdir(r'C:\Python27\Tools\pynche')
True
>>> os.path.isfile(r'C:\Python27\Tools\pynche')
False

花点时间来研究这组例子。在第一个例子中,我们将一个路径传递给一个文件,并检查该路径是否真的是一个文件。然后,第二个示例检查相同的路径,看它是否是一个目录。你可以自己看看结果如何。然后,在最后两个示例中,我们通过将路径传递到同两个函数的目录来稍微转换一些内容。这些例子演示了这两个函数是如何工作的。

os.path.join

这个 join 方法使您能够使用适当的分隔符将一个或多个路径组件连接在一起。例如,在Windows上,分隔符是反斜杠,但在Linux上,分隔符是正斜杠。工作原理如下:

>>> os.path.join(r'C:\Python27\Tools\pynche', 'ChipViewer.py')
'C:\\Python27\\Tools\\pynche\\ChipViewer.py'

在这个例子中,我们将一个目录路径和一个文件路径结合在一起,得到一个完全限定的路径。但是请注意, join 方法做 not 检查结果是否真实存在!

os.path.split

这个 分裂 方法将路径拆分为包含目录和文件的元组。让我们看看:

>>> os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py')
('C:\\Python27\\Tools\\pynche', 'ChipViewer.py')

这个例子显示了当我们在一个带有文件的路径中进行路径时会发生什么。让我们看看如果路径末尾没有文件名会发生什么:

 >>> os.path.split(r'C:\Python27\Tools\pynche')
('C:\\Python27\\Tools', 'pynche')

如您所见,它采用路径并将其拆分,这样最后一个子文件夹就成为元组的第二个元素,路径的其余部分在第一个元素中。

对于最后一个示例,我认为您可能希望看到 分裂

>>> dirname, fname = os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py')
>>> dirname
'C:\\Python27\\Tools\\pynche'
>>> fname
'ChipViewer.py'

这显示了如何执行多个分配。拆分路径时,它返回一个两元素元组。因为左边有两个变量,所以元组的第一个元素被分配给第一个变量,第二个元素被分配给第二个变量。

总结

此时,您应该非常熟悉 os 模块。在本章中,您学习了以下内容:

  • 如何使用环境变量

  • 更改目录并发现当前工作目录

  • 创建和删除文件夹和文件

  • 重命名文件/文件夹

  • 用关联的应用程序启动文件

  • 浏览目录

  • 使用路径

os 本节未涉及的模块。一定要阅读文档,看看还能做什么。在下一章中,我们将学习 电子邮件SMTPLIB 模块。