Python中的os模块和sys模块

0. 引言

Python中的os模块和sys是比较常用的模块,os全称为Operation System,sys全称为System。

使用这两个模块之前必须进行导入(集成于Python,无需额外安装):

import os
import sys

1. os模块

1.1 os.getcwd()

作用:获取当前的工作路径

cwd: current work directory,当前工作目录

例子1

>>> import os
>>> os.getcwd()
'/home/leovin'

例子2
Python中的os模块和sys模块_第1张图片
文件test.py的文件所在路径为:PyTorchProject/A2_object_detection/faster_rcnn/network_files/test.py
那么执行os.getcwd()后的结果如下:

print(os.getcwd())  # /home/leovin/PyTorchProject/A2_object_detection/faster_rcnn/network_files

很明显,返回的是当前运行文件的目录


那么,对于被调用的文件,它的cwd是什么呢?

例子3
执行文件test_1.py的文件所在路径为:PyTorchProject/A2_object_detection/faster_rcnn/network_files/test_1.py
被调用的文件test_2.py的文件所在路径为:PyTorchProject/A2_object_detection/faster_rcnn/label_our_datasets/test_2.py
二者的所属上级文件夹名称不同

  • test_1 -> network_files
  • test_2 -> label_our_datasets

二者的内容分别为

# test_2
import os

print(f"被调用文件 test_2.py 的工作目录为:{os.getcwd()}")


# test_1
import os
from A2_object_detection.faster_rcnn.label_our_datasets import test_2

print(f"调用test_2文件")
print(f"执行文件 test_1.py 的工作目录为: {os.getcwd()}")

执行test_1.py的结果为:

被调用文件 test_2.py 的工作目录为:/home/leovin/PyTorchProject/A2_object_detection/faster_rcnn/network_files
调用test_2文件
执行文件 test_1.py 的工作目录为: /home/leovin/PyTorchProject/A2_object_detection/faster_rcnn/network_files

可以看到,虽然二者所属文件夹不同,但os.getcwd()是相对运行文件的!不管被调用的文件在哪个文件夹下,它们的cwd均为运行文件的cwd

1.2 os.listdir(path)

作用:传入任意一个path路径,返回的是该路径所有文件目录组成的列表(list)

例子1:单个文件夹下(没有子文件夹)
Python中的os模块和sys模块_第2张图片

>>> path = "/home/leovin/PyTorchProject/python_syntax/folder_1"
>>> os.listdir(path)
['folder_1_file_1.py', 'folder_1_file_2.py']

例子2:单个文件夹(包含子文件夹)
Python中的os模块和sys模块_第3张图片

>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> os.listdir(path)
['folder_1', 'folder_2', 'file_2.py', 'file_1.py']

可以看到,os.listdir()并不会遍历子文件夹

  • folder_1为文件夹
  • folder_2为文件夹

1.3 os.walk(path)

作用 :传入任意一个path路径,深层次遍历指定路径下的所有子文件夹,返回的是一个由①路径、②文件夹列表、③文件列表组成的元组

例子1:(没有子文件夹)
Python中的os模块和sys模块_第4张图片

>>> path = "/home/leovin/PyTorchProject/python_syntax/folder_1"
>>> for path, dirs, files in os.walk(path):
...     print(f"path \t dirs \t files \t \n{path} \t {dir} \t {files} ")
... 
path 	 dirs 	 files 	 
/home/leovin/PyTorchProject/python_syntax/folder_1 	 <built-in function dir> 	 ['folder_1_file_1.py', 'folder_1_file_2.py']

例子2:单个文件夹(包含子文件夹)
Python中的os模块和sys模块_第5张图片

>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> for path, dirs, files in os.walk(path):
...     print(f"path \t dirs \t files \t\n{path} \t {dir} \t {files}")
... 
path 	 dirs 	 files 	
/home/leovin/PyTorchProject/python_syntax 	 <built-in function dir> 	 ['file_2.py', 'file_1.py']
path 	 dirs 	 files 	
/home/leovin/PyTorchProject/python_syntax/folder_1 	 <built-in function dir> 	 ['folder_1_file_1.py', 'folder_1_file_2.py']
path 	 dirs 	 files 	
/home/leovin/PyTorchProject/python_syntax/folder_2 	 <built-in function dir> 	 ['folder_2_file_2.py', 'folder_2_file_1.py']
path 	 dirs 	 files 	
/home/leovin/PyTorchProject/python_syntax/data 	 <built-in function dir> 	 ['data_1.txt', 'data_2.xml', 'data_3.json']

1.4 os.path.exists(path)

作用:传入一个path路径,判断指定路径下的目录是否存在

  • 存在返回True
  • 不存在返回False

例子1

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> os.path.exists(path)
False

例子2:和if else连用

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> if not os.path.exists(path):  # 文件夹不存在
...     os.mkdir(path)  # 若不存在则创建
...     print("文件不存在,已创建!")
... else:
...     print("该文件夹已存在,无需创建")
... 
文件不存在,已创建!

例子3:检查文件是否存在并报错(assert)

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> assert os.path.exists(path), f"[{path}]文件夹不存在!抛出异常!"
Traceback (most recent call last):
  File "", line 1, in <module>
AssertionError: [/home/leovin/PyTorchProject/python_syntax/不存在的文件夹]文件夹不存在!抛出异常!

1.5 os.mkdir(path)

作用:传入一个path路径,创建单层(单个)文件夹

Note:如果文件夹存在,就会报错
因此创建文件夹之前,一般使用os.path.exists(path)判断文件夹是否存在(即上一节中的例2)
makedirs(path, exist_ok=False)不同,os.mkdir()并没有exist_ok参数

例子1:朴素的用法——直接创建一个不存在的文件夹

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> os.mkdir(path)  # 不报错就说明文件夹已创建

例子2报错的用法——直接创建一个存在的文件夹

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> os.mkdir(path)
Traceback (most recent call last):
  File "", line 1, in <module>
FileExistsError: [Errno 17] File exists: '/home/leovin/PyTorchProject/python_syntax/不存在的文件夹'

1.6 os.makedirs(path, exist_ok=False)

作用:传入一个path路径,生成一个递归的文件夹

Note:exist_ok默认为False,即如果文件夹已经存在,就会报错
exist_ok=True,则文件夹存在也不会报错!
因此创建文件夹之前,一般使用os.path.exists(path)函数判断文件夹是否存在;

Note:

  • 在Python3中,os.makedirs()os.mkdir()是一样的,只不过os.makedirs(path, exist_ok=Fasle)有一个exist_ok参数(默认为False),而os.mkdir(path)没有exist_ok参数。

例子1:朴素的用法——直接创建一个不存在的文件夹

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> os.makedirs(path)  # 不报错就说明文件夹已创建

例子2报错的用法——直接创建一个存在的文件夹(exist_ok=False(默认值))

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> os.makedirs(path)
Traceback (most recent call last):
  File "", line 1, in <module>
  File "/home/leovin/anaconda3/envs/learning/lib/python3.9/os.py", line 225, in makedirs
    mkdir(name, mode)
FileExistsError: [Errno 17] File exists: '/home/leovin/PyTorchProject/python_syntax/不存在的文件夹'

例子3:直接创建一个存在的文件夹,但不报错(exist_ok=True)

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> os.makedirs(path, exist_ok=True)  # 不报错就说明文件夹已创建

1.7 os.rmdir(path)

作用:传入一个path路径,删除指定路径下的文件夹

Note:该方法只能删除空文件夹,删除非空文件夹会报错

例子1:删除一个文件夹

>>> path = "/home/leovin/PyTorchProject/python_syntax/不存在的文件夹"
>>> os.rmdir(path)  # 不报错就说明删除该文件夹了

例子2:[报错] 删除一个非空文件夹

>>> path = "/home/leovin/PyTorchProject/python_syntax/folder_1"
>>> os.rmdir(path)
Traceback (most recent call last):
  File "", line 1, in <module>
OSError: [Errno 39] Directory not empty: '/home/leovin/PyTorchProject/python_syntax/folder_1'

1.8 os.path.join(path_1, path_2)

作用:传入两个path路径,将该路径拼接起来,形成一个新的完整路径

例子1:最朴素的用法——拼接两个字符串

>>> path_1 = "第一个路径/"
>>> path_2 = "第二个路径"
>>> os.path.join(path_1, path_2)
'第一个路径/第二个路径'

例子2:构造数据集常用

# 1. 朴素的写法
>>> data_path = "/home/leovin/PyTorchProject/python_syntax/data/"
>>> data_name = ["1.jpg", "2.jpg", "3.jpg"]
>>> full_list = []
>>> for name in data_name:
...     full_list.append(os.path.join(data_path, name))
... 
>>> full_list
['/home/leovin/PyTorchProject/python_syntax/data/1.jpg', '/home/leovin/PyTorchProject/python_syntax/data/2.jpg', '/home/leovin/PyTorchProject/python_syntax/data/3.jpg']

# 2. 列表推导式
>>> data_path = "/home/leovin/PyTorchProject/python_syntax/data/"
>>> data_name = ["1.jpg", "2.jpg", "3.jpg"]
>>> full_list = [os.path.join(data_path, name) for name in data_name]
>>> full_list
['/home/leovin/PyTorchProject/python_syntax/data/1.jpg', '/home/leovin/PyTorchProject/python_syntax/data/2.jpg', '/home/leovin/PyTorchProject/python_syntax/data/3.jpg']

例子3:和Python自带的str.join()方法的区分

>>> data_path = "/home/leovin/PyTorchProject/python_syntax/data/"
>>> data_name = ["1.jpg", "2.jpg", "3.jpg"]
>>> # 1. os.path.join(path_1, path_2)
>>> full_list = [os.path.join(data_path, name) for name in data_name]
>>> full_list
['/home/leovin/PyTorchProject/python_syntax/data/1.jpg', '/home/leovin/PyTorchProject/python_syntax/data/2.jpg', '/home/leovin/PyTorchProject/python_syntax/data/3.jpg']
>>> # 2. Python的str.join(seq)
>>> full_list = [data_path.join(name) for name in data_name]
>>> full_list
['1/home/leovin/PyTorchProject/python_syntax/data/./home/leovin/PyTorchProject/python_syntax/data/j/home/leovin/PyTorchProject/python_syntax/data/p/home/leovin/PyTorchProject/python_syntax/data/g', '2/home/leovin/PyTorchProject/python_syntax/data/./home/leovin/PyTorchProject/python_syntax/data/j/home/leovin/PyTorchProject/python_syntax/data/p/home/leovin/PyTorchProject/python_syntax/data/g', '3/home/leovin/PyTorchProject/python_syntax/data/./home/leovin/PyTorchProject/python_syntax/data/j/home/leovin/PyTorchProject/python_syntax/data/p/home/leovin/PyTorchProject/python_syntax/data/g']

1.9 os.path.split(path)

作用:传入一个完整的path路径,将其拆分为绝对路径和文件名2部分

例子

>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> os.path.split(path)
('/home/leovin/PyTorchProject', 'python_syntax')
>>> abs_path, file_name = os.path.split(path)
>>> print(f"absolute_path: {abs_path}\nfile_name: {file_name}")
absolute_path: /home/leovin/PyTorchProject
file_name: python_syntax

1.10 os.path.dirname(path)

作用:传入一个完整的文件路径(相对操作系统),只获取其绝对路径(相对项目)

例子

>>> path = "/home/leovin/PyTorchProject/python_syntax"  # 相对操作系统的绝对路径
>>> os.path.dirname(path)
'/home/leovin/PyTorchProject'  # 相对项目的绝对路径

1.11 os.path.basename(path)

作用:传入一个完整的文件路径,只获取其文件名

例子

>>> path = "/home/leovin/PyTorchProject/python_syntax"  # 相对系统的绝对路径
>>> os.path.basename(path)
'python_syntax'  # 文件名

1.12 os.path.isdir(path)

作用:传入一个完整的文件路径,判断它是否是文件夹

例子

>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> os.path.isdir(path)
True

1.13 os.path.isfile(path)

作用:传入一个完整的文件路径,判断它是否是文件

例子

>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> os.path.isfile(path)
False

1.14 os.path.sep

作用:返回当前操作系统的路径分隔符

  • Windows下为://
  • Linux下为:/

sep = separate

例子1:演示用法

>>> os.path.sep
'/'

例子2: 增加代码可用性——自适应分隔符(不用担心因为Windows和Linux系统不一样导致路径错误了)

>>> sep = os.path.sep
>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> path_adaptive = path.replace("/", sep)  # 对/进行分隔符替换
>>> print(f"before: {path}\nafter: {path_adaptive}")
before: /home/leovin/PyTorchProject/python_syntax
after: /home/leovin/PyTorchProject/python_syntax

1.15 os.path.getsize(path)

作用:传入一个完整的文件路径,返回该文件的大小

例子1:包含文件的文件夹

>>> os.path.getsize(path)
4096

例子2:空文件夹

>>> path = "/home/leovin/PyTorchProject/python_syntax/empty_folder"
>>> os.path.getsize(path)
4096

例子3:单个文件

>>> os.path.getsize(path)
65

os.path.getsize(path)方法并不会统计文件夹里面文件的大小,只会返回输入路径文件/文件夹大小

  • 其中文件夹默认为4096

2. sys模块

sys模块是与Python解释器交互的一个接口。sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分。

2. 1 查看运行代码时传入的参数 —— sys.argv

在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称

总结

sys.argv[0] 表示程序自身
sys.argv[1] 表示程序的第一个参数
sys.argv[2] 表示程序的第二个参数

例子1

import sys

print(sys.argv)  # ['/home/leovin/PyTorchProject/python_syntax/folder_1/folder_1_file_1.py']

例子2:给folder_1_file_1.py脚本传入参数

import sys

print(sys.argv)

# 启动代码:
(learning) leovin@leovin-Ubuntu:~/PyTorchProject$ python ./python_syntax/folder_1/folder_1_file_1.py a="传入的第一个参数", b=2, 随便传, d={12312}
['./python_syntax/folder_1/folder_1_file_1.py', 'a=传入的第一个参数,', 'b=2,', '随便传,', 'd={12312}']

2.2 通过设计手动退出程序(中途退出程序) —— sys.exit(n)

语法

sys.exit()  # int为成功执行程序并中途退出;其他对象为失败执行程序并中途退出

2.2.1 成功退出

import sys

"""
    通过引发 SystemExit(status) 退出解释器。
        如果状态被省略或无,则默认为零(即成功)。 
        如果状态为整数,则作为系统退出状态。 
        如果它是另一种对象,它将被打印并且系统退出状态将为一个(即失败)。
"""
print("执行 sys.exit() 之前")
sys.exit(8)  # 默认为0(整数即为退出程序成功)
print("执行 sys.exit() 之后")

"""
	执行 sys.exit() 之前

	Process finished with exit code 8
"""

2.2.2 失败退出

import sys

"""
    通过引发 SystemExit(status) 退出解释器。
        如果状态被省略或无,则默认为零(即成功)。 
        如果状态为整数,则作为系统退出状态。 
        如果它是另一种对象,它将被打印并且系统退出状态将为一个(即失败)。
"""
print("执行 sys.exit() 之前")
sys.exit("程序执行失败,已经退出!")  # 默认为0(整数即为退出程序成功)
print("执行 sys.exit() 之后")


"""
    执行 sys.exit() 之前
    程序执行失败,已经退出!
"""

2.3 获取Python解释器版本 —— sys.version

>>> import sys
>>> sys.version
'3.9.12 (main, Apr  5 2022, 06:56:58) \n[GCC 7.5.0]'

2.4 返回操作系统的平台名称 —— sys.platform

>>> import sys
>>> sys.platform
'linux'

2.5 等待用户输入 —— sys.stdin.readline() & input

sys.stdin.readline() 相当于input,区别在于:

  1. input不会读入\nsys.stdin.readline()会读入\n
  2. input默认参数为字符串,可充当提示语,而sys.stdin.readline没有这个参数
>>> import sys
>>> user_input_1 = sys.stdin.readline()  # 不能输入提示语
sys输入的数据
>>> user_input_2 = input("请输入:(提示语)")  # 参数为str,可充当提示语
请输入:(提示语)input输入的数据
>>> print(f"user_input_1: {user_input_1}\nuser_input_2: {user_input_2}")
user_input_1: sys输入的数据

user_input_2: input输入的数据
>>> user_input_1
'sys输入的数据\n'  # 自动录入换行符
>>> user_input_2
'input输入的数据'  # 没有换行符

2.6 用list形式返回所有已经导入的模块 —— sys.modules.keys()

>>> sys.modules.keys()
dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', '_io', 'marshal', 'posix', '_frozen_importlib_external', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', 'encodings.latin_1', '_abc', 'abc', 'io', '__main__', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', '_locale', '_bootlocale', '_distutils_hack', 'types', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib', 'importlib.machinery', '_heapq', 'heapq', 'itertools', 'keyword', '_operator', 'operator', 'reprlib', '_collections', 'collections', 'collections.abc', '_functools', 'functools', 'contextlib', 'enum', '_sre', 'sre_constants', 'sre_parse', 'sre_compile', 'copyreg', 're', 'typing.io', 'typing.re', 'typing', 'importlib.abc', 'importlib.util', 'google', 'mpl_toolkits', 'site', 'readline', 'atexit', 'rlcompleter'])

2.7 用list返回所有已导入模块 —— sys.builtin_module_names

>>> sys.builtin_module_names
('_abc', '_ast', '_codecs', '_collections', '_functools', '_imp', '_io', '_locale', '_operator', '_peg_parser', '_signal', '_sre', '_stat', '_string', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 'atexit', 'builtins', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'posix', 'pwd', 'sys', 'time', 'xxsubtype')

2.8 查看一个库的所有方法 —— dir(xx)

>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework', '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'platlibdir', 'prefix', 'ps1', 'ps2', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions']

你可能感兴趣的:(PyTorch,面试题,python,深度学习)