Python中的os模块和sys是比较常用的模块,os全称为Operation System,sys全称为System。
使用这两个模块之前必须进行导入(集成于Python,无需额外安装):
import os
import sys
os
模块os.getcwd()
作用:获取当前的工作路径
cwd: current work directory,当前工作目录
例子1:
>>> import os
>>> os.getcwd()
'/home/leovin'
例子2:
文件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_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。
os.listdir(path)
作用:传入任意一个path路径
,返回的是该路径下所有文件和目录组成的列表(list)
>>> path = "/home/leovin/PyTorchProject/python_syntax/folder_1"
>>> os.listdir(path)
['folder_1_file_1.py', 'folder_1_file_2.py']
>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> os.listdir(path)
['folder_1', 'folder_2', 'file_2.py', 'file_1.py']
可以看到,os.listdir()
并不会遍历子文件夹!
os.walk(path)
作用 :传入任意一个path路径
,深层次遍历指定路径下的所有子文件夹,返回的是一个由①路径、②文件夹列表、③文件列表组成的元组。
>>> 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']
>>> 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']
os.path.exists(path)
作用:传入一个path路
径,判断指定路径下的目录是否存在。
例子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/不存在的文件夹]文件夹不存在!抛出异常!
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/不存在的文件夹'
os.makedirs(path, exist_ok=False)
作用:传入一个path路径
,生成一个递归的文件夹;
Note:exist_ok默认为False,即如果文件夹已经存在,就会报错。
exist_ok=True
,则文件夹存在也不会报错!
因此创建文件夹之前,一般使用os.path.exists(path)
函数判断文件夹是否存在;
Note:
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) # 不报错就说明文件夹已创建
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'
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']
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
os.path.dirname(path)
作用:传入一个完整的文件路径(相对操作系统),只获取其绝对路径(相对项目)
例子:
>>> path = "/home/leovin/PyTorchProject/python_syntax" # 相对操作系统的绝对路径
>>> os.path.dirname(path)
'/home/leovin/PyTorchProject' # 相对项目的绝对路径
os.path.basename(path)
作用:传入一个完整的文件路径,只获取其文件名
例子:
>>> path = "/home/leovin/PyTorchProject/python_syntax" # 相对系统的绝对路径
>>> os.path.basename(path)
'python_syntax' # 文件名
os.path.isdir(path)
作用:传入一个完整的文件路径,判断它是否是文件夹
例子:
>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> os.path.isdir(path)
True
os.path.isfile(path)
作用:传入一个完整的文件路径,判断它是否是文件
例子:
>>> path = "/home/leovin/PyTorchProject/python_syntax"
>>> os.path.isfile(path)
False
os.path.sep
作用:返回当前操作系统的路径分隔符
//
/
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
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)
方法并不会统计文件夹里面文件的大小,只会返回输入路径文件/文件夹大小
sys
模块sys模块
是与Python解释器交互的一个接口。sys 模块
提供了许多函数和变量来处理 Python 运行时环境的不同部分。
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}']
sys.exit(n)
语法:
sys.exit() # int为成功执行程序并中途退出;其他对象为失败执行程序并中途退出
import sys
"""
通过引发 SystemExit(status) 退出解释器。
如果状态被省略或无,则默认为零(即成功)。
如果状态为整数,则作为系统退出状态。
如果它是另一种对象,它将被打印并且系统退出状态将为一个(即失败)。
"""
print("执行 sys.exit() 之前")
sys.exit(8) # 默认为0(整数即为退出程序成功)
print("执行 sys.exit() 之后")
"""
执行 sys.exit() 之前
Process finished with exit code 8
"""
import sys
"""
通过引发 SystemExit(status) 退出解释器。
如果状态被省略或无,则默认为零(即成功)。
如果状态为整数,则作为系统退出状态。
如果它是另一种对象,它将被打印并且系统退出状态将为一个(即失败)。
"""
print("执行 sys.exit() 之前")
sys.exit("程序执行失败,已经退出!") # 默认为0(整数即为退出程序成功)
print("执行 sys.exit() 之后")
"""
执行 sys.exit() 之前
程序执行失败,已经退出!
"""
sys.version
>>> import sys
>>> sys.version
'3.9.12 (main, Apr 5 2022, 06:56:58) \n[GCC 7.5.0]'
sys.platform
>>> import sys
>>> sys.platform
'linux'
sys.stdin.readline()
& input
sys.stdin.readline()
相当于input
,区别在于:
input
不会读入\n
,sys.stdin.readline()
会读入\n
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输入的数据' # 没有换行符
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'])
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')
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']