Python 有一个专门的模块,用于与安装 Python 的机器的操作系统一起工作和互动。这就是 Python os 模块。它是一个很好的工具,有许多有用的功能,可以直接操作文件系统。os 模块在任何你喜欢的操作系统上都能很好地工作,无论是 Windows、Linux 还是 Mac。Python模块非常广泛,在这个Python os模块教程中,我们将看看一些最有用和最常见的技术,你可以使用。
os 模块可以为我们做什么?
os 模块可以做很多事情,这里列出了一些比较常见的任务,你可以做。
- 获取操作系统的名称
- 获取当前工作目录
- 改变目录
- 获取或设置用户和组信息
- 测试对一个路径的访问,看一个文件或目录是否存在
- 返回一个目录中的实体列表
- 创建一个目录
- 删除和重命名文件和目录
- 获取一个文件的统计信息
- 生成文件和目录名称
- 杀死一个进程
如何使用os模块
在使用os模块之前,必须将其导入你的Python程序中。一个简单的导入语句将为我们完成这个任务。
import os
getcwd()
返回一个代表当前工作目录的Unicode字符串。
import os
print(os.getcwd())
C:\python\osmodule
chdir(path)
将当前工作目录改为指定的路径。路径可以总是被指定为一个字符串。在某些平台上,path也可以被指定为一个开放的文件描述符。如果这个功能不可用,使用它将引发一个异常。
import os
os.chdir('c:/python')
print(os.getcwd())
c:\python
listdir(path=None)
返回一个包含目录中的文件名的列表。路径可以指定为str、byte或类似路径的对象。如果路径是字节,返回的文件名也将是字节;在所有其他情况下,返回的文件名将是str。如果路径是None,则使用path='.'。在某些平台上,path也可以被指定为一个开放的文件描述符;/文件描述符必须指向一个目录。如果这个功能不可用,使用它将引发NotImplementedError。这个列表的顺序是任意的。它不包括特殊条目'.'和'.',即使它们存在于目录中。
import os
print(os.listdir())
['.idea', 'main.py']
mkdir(path, mode=511, *, dir_fd=None)
**创建一个目录。**如果dir_fd不是None,它应该是一个打开到目录的文件描述符,并且路径应该是相对的;然后路径将是相对于该目录的。dir_fd可能在你的平台上没有实现。如果它不可用,使用它将引发一个 NotImplementedError。模式参数在Windows上被忽略。
import os
os.mkdir('New Directory')
print(os.listdir())
['.idea', 'main.py', 'New Directory']
makedirs(name, mode=511, exist_ok=False)
makedirs(name [, mode=0o777][, exist_ok=False])
超级mkdir;创建一个叶子目录和所有中间目录。工作原理与mkdir类似,除了任何中间路径段(不仅仅是最右边的)如果不存在将被创建。如果目标目录已经存在,如果existence_ok为False,则引发一个OSError。否则不会引发异常。这是一个递归函数。
import os
os.makedirs('directory/with/many/levels')
print(os.listdir())
['.idea', 'directory', 'main.py', 'New Directory']
rmdir(path, *, dir_fd=None)
删除一个目录。如果dir_fd不是None,它应该是一个打开到一个目录的文件描述符,并且路径应该是相对的;然后路径将是相对于该目录的。如果它不可用,使用它将引发一个 NotImplementedError。
import os
os.rmdir('New Directory')
print(os.listdir())
['.idea', 'directory', 'main.py']
试图删除一个非空的目录将产生一个错误。
import os
os.rmdir('directory')
print(os.listdir())
Traceback (most recent call last):
File "C:\python\osmodule\main.py", line 3, in
os.rmdir('directory')
OSError: [WinError 145] The directory is not empty: 'directory'
removedirs(name)
removedirs(name)
超级rmdir;删除一个叶子目录和所有空的中间目录。工作原理与rmdir类似,但如果叶子目录被成功删除,对应于最右边路径段的目录将被修剪,直到整个路径被消耗或发生错误。后一阶段的错误会被忽略--它们通常意味着一个目录不是空的。
import os
os.removedirs('directory/with/many/levels')
print(os.listdir())
['.idea', 'main.py']
rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
重命名一个文件或目录。如果src_dir_fd或dst_dir_fd不是None,应该是一个打开到目录的文件描述符,并且各自的路径字符串(src或dst)应该是相对的;然后路径将是相对于该目录的。 src_dir_fd和dst_dir_fd,可能在你的平台上没有实现。如果它们不可用,使用它们将引发一个NotImplementedError。
import os
open('created_file.py', 'w').close()
os.rename('created_file.py', 'renamed_file.py')
print(os.listdir())
['.idea', 'main.py', 'renamed_file.py']
stat(path, *, dir_fd=None, follow_symlinks=True)
对给定的路径执行 stat 系统调用。path 要检查的路径;可以是字符串、字节、类似路径的对象或 open-file-descriptor int。 dir_fd 如果不是 None,应该是一个打开到目录的文件描述符,并且 path 应该是一个相对字符串;然后 path 将相对于该目录。 follow_symlinks 如果是 False,并且路径的最后元素是一个符号链接, stat 将检查符号链接本身而不是链接指向的文件。如果它们不可用,使用它们将引发一个 NotImplementedError。当指定path为开放文件描述符时,使用dir_fd或follow_symlinks是一个错误。
import os
good_info = os.stat('renamed_file.py')
print(good_info)
os.stat_result(st_mode=33206, st_ino=71494644084647853, st_dev=4063410304, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1642185288, st_mtime=1642185288, st_ctime=1642185288)
walk(top, topdown=True, onerror=None, followlinks=False)
目录树生成器。对于以top为根的目录树中的每个目录(包括top本身,但不包括'.'和'...'),产生一个3元组dirpath, dirnames, filenames dirpath是一个字符串,是目录的路径。dirnames是dirpath中子目录的名称列表(不包括'.'和'...')。注意,列表中的名字只是名字,没有路径成分。要获得dirpath中的文件或目录的完整路径(以top开头),请执行os.path.join(dirpath, name)。
如果可选的参数'topdown'为true或者没有指定,那么目录的三元组将在其任何子目录的三元组之前生成(目录是自上而下生成的)。如果topdown为false,一个目录的三元组将在其所有子目录的三元组之后生成(目录是自下而上生成的)。
当topdown为true时,调用者可以就地修改dirnames列表(例如,通过del或slice赋值),而walk将只递归到dirnames中仍有名字的子目录;这可以用来修剪搜索,或者强加一个特定的访问顺序。当topdown为false时,修改dirnames对os.walk()的行为没有影响,因为当dirnames本身被生成时,dirnames中的目录已经被生成。无论topdown的值是多少,在生成目录及其子目录的图元之前都会检索子目录列表。
默认情况下,来自os.scandir()调用的错误会被忽略。如果指定了可选的参数'onerror',它应该是一个函数;它将被调用,有一个参数,一个 OSError 实例。它可以报告错误以继续行走,或者引发异常以中止行走。注意,文件名可以作为异常对象的文件名属性。
默认情况下,在支持符号链接的系统上,os.walk 不跟踪子目录的符号链接。为了获得这个功能,请将可选参数'followlinks'设置为 true。
import os
for root, dirs, files in os.walk('c:\python\osmodule'):
for name in files:
print('file: ' + os.path.join(root, name))
for name in dirs:
print('dir: ' + os.path.join(root, name))
file: C:\python\osmodule\main.py
file: C:\python\osmodule\renamed_file.py
dir: C:\python\osmodule\.idea
file: C:\python\osmodule\.idea\.gitignore
file: C:\python\osmodule\.idea\misc.xml
file: C:\python\osmodule\.idea\modules.xml
file: C:\python\osmodule\.idea\osmodule.iml
file: C:\python\osmodule\.idea\workspace.xml
dir: C:\python\osmodule\.idea\inspectionProfiles
file: C:\python\osmodule\.idea\inspectionProfiles\profiles_settings.xml
file: C:\python\osmodule\.idea\inspectionProfiles\Project_Default.xml
os.environ
Python 中的 os.environ 是一个映射对象,代表用户的环境变量。它返回一个以用户环境变量为键,以它们的值为值的字典。os.environ 的行为就像一个 python 字典,所以所有常见的字典操作如 get 和 set 都可以被执行。我们也可以修改os.environ,但任何修改都只对当前分配给它的进程有效,它不会永久地改变值。
import os
good_vals = os.environ
for k, v in good_vals.items():
print(f"{k} = {v}"
prints out all environ values
获得一个单一的environ值。
import os
good_vals = os.environ.get('homedrive')
print(good_vals)
C:
os.path.join()
join(path, *paths) - 连接两个(或多个)路径。
import os
good_vals = os.environ.get('homedrive')
joined = os.path.join(good_vals, '/index.html')
print(joined)
C:/index.html
os.path.basename()
basename(p) 返回一个路径名的最终组成部分。
import os
basename = os.path.basename('path/to/file.html')
print(basename)
file.html
os.path.dirname()
dirname(p) 返回一个路径名的目录部分。
import os
dirname = os.path.dirname('path/to/file.html')
print(dirname)
path/to
split(p)
分割一个路径名。返回元组(head, tail),其中tail是最后的斜线之后的所有内容。两个部分都可以是空的。
import os
split = os.path.split('path/to/file.html')
print(split)
('path/to', 'file.html')
exists(path)
测试一个路径是否存在。如果符号链接被破坏,则返回False。
import os
imaginary = os.path.exists('path/to/file.html')
real = os.path.exists('c:/python/osmodule/main.py')
print(imaginary)
print(real)
False
True
isfile() 和 isdir()
检查路径是否是一个文件或路径是否是一个目录。
import os
contents = os.listdir()
for item in contents:
if os.path.isdir(item):
print(item + " is a directory")
elif os.path.isfile(item):
print(item + " is a file")
.idea is a directory
main.py is a file
renamed_file.py is a file
splitext(p)
从路径名中分割出扩展名。扩展名是指从最后一个点到最后一个点的所有内容,忽略前导点。返回"(root, ext)";ext可能为空。
import os
file_and_extension = os.path.splitext('renamed_file.py')
print(file_and_extension)
('renamed_file', '.py')
把它放在一起
每个例子本身都是有帮助的,但一个完整的工作程序将显示这些类型的命令是如何结合在一起的。通过使用一些os模块函数的组合,我们可以创建一些整洁的实用程序。下面这个程序可以简单地批量重命名一个文件夹及其所有子文件夹中的文件。手动操作是一个相当乏味的过程,这是一个完美的例子,说明如何使用Python来自动处理无聊的事情,正如他们所说。向Al Sweigart致敬!下面是代码,其中突出了os函数。
import sys
import os
def main():
find, replace, root_dir = get_input()
if os.path.exists(root_dir) is False:
print("This path does not exist.")
else:
print("Doing replacement...")
rename_all_files(find, replace, root_dir)
print()
def get_input():
print(" You entered", len(sys.argv) - 1, "arguments at the command line.")
if len(sys.argv) != 4:
raise Exception(
" Error: Wrong number of arguments. Enter 3 arguments: 1. "
"string to replace 2. replacement string 3. path for files ")
find = sys.argv[1]
replace = sys.argv[2]
root_dir = sys.argv[3]
print(' Find this string:\t', find)
print(' Replace with this string:\t', replace)
print(' Start in this directory:\t', root_dir)
print()
return find, replace, root_dir
def rename_all_files(find, replace, root_dir):
files_changed_count = 0
for (root, dirs, files) in os.walk(root_dir):
for old_filename in files:
if os.path.exists(str(root) + '/' + str(old_filename)) is False:
print("This file name does not exist.")
break
new_name = old_filename.replace(find, replace)
if old_filename != new_name:
print("Old filename is: " + str(old_filename))
print('New filename is:', new_name, '\n')
path_with_old_file = root + "/" + old_filename
path_with_new_file = root + "/" + new_name
os.rename(path_with_old_file, path_with_new_file)
files_changed_count = files_changed_count + 1
print()
print('Renamed: ', files_changed_count, ' file(s)')
if __name__ == '__main__':
main()
python $python rename_files.py 'old' 'new' 'c:/python/renametest'
You entered 3 arguments at the command line.
Find this string: old
Replace with this string: new
Start in this directory: c:/python/renametest
Doing replacement...
Old filename is: anotheroldfile.html
New filename is: anothernewfile.html
Old filename is: oldfile.txt
New filename is: newfile.txt
Old filename is: someoldfile.txt
New filename is: somenewfile.txt
Old filename is: nestedanotheroldfile.html
New filename is: nestedanothernewfile.html
Old filename is: nestedoldfile.txt
New filename is: nestednewfile.txt
Old filename is: nestedsomeoldfile.txt
New filename is: nestedsomenewfile.txt
Old filename is: 3deepanotheroldfile.html
New filename is: 3deepanothernewfile.html
Old filename is: 3deepoldfile.txt
New filename is: 3deepnewfile.txt
Old filename is: 3deepsomeoldfile.txt
New filename is: 3deepsomenewfile.txt
Renamed: 9 file(s)
运行这个文件简直只花了一秒钟。手动重命名所有这些文件将花费更长的时间。
了解更多关于 Python os 模块的信息
- 使用Python Os模块(tutorialsteacher.com)
- 如何使用Python Os模块教程 (code-learner.com)
- Python Os系统 (makeuseof.com)
- 在Python中使用Os模块处理文件(pythonforbeginners.com)
- Pythonlibrary Os模块(python101.pythonlibrary.org)
- 如何在Windows上安装Os模块(stackoverflow.com)
- Python Library Os(docs.python.org)
- Python Tutorial Stdlib(docs.python.org)
- Linux上的最佳Python Os模块实例 (cyberithub.com)
- Python Os模块(javatpoint.com)
- Python Os Module Tutorial With Example (appdividend.com)
- PythonOs Module Cheat Sheet Code Example(newbedev.com)
- Python Subprocess (golinuxcloud.com)
Python os模块教程摘要
Python中的os模块为你提供了许多属性和方法,因此你可以以一种简单而有效的方式与底层操作系统进行交互。最棒的是,所有这些方法在所有类型的操作系统(如 Windows、Linux 和 Apple 操作系统)上都同样有效。我们很好地看了os模块中的许多常用函数,然后看了一个完成的Python程序,该程序能够以一种干净有效的方式重命名一个目录及其子目录中的文件。
