Skip to content

IO

Python的自带模块 os 可以进行许多与操作系统相关的操作。

例如 查看当前系统类型

1
2
3
>>> import os
>>> os.name
'nt'

nt表示windowsposix表示Linux/Unix/Mac OS X

Linux/Unix/Max OS X上想获得更详细的信息,可以使用uname(),不过在windows上不提供

1
2
3
>>> import os
>>> os.uname()
posix.uname_result(sysname='Darwin', nodename='MichaelMacPro.local', release='14.3.0', version='Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015; root:xnu-2782.20.48~5/RELEASE_X86_64', machine='x86_64')

再例如 查看环境变量os.environ

1
2
3
>>> import os
>>> os.environ
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\pr919\\AppData\\Roaming', 'ASL.LOG': 'Destination=file', 'CATALINA_HOME': 'D:\\---Programming---\\IntelliJ IDEA\\apache-tomcat-8.5.42', ..., 'WT_SESSION': '245de0da-1ef4-4cda-93ca-c132289e2c9c'})

这样就列出了所有环境变量了

如果要获得某一条,可以用os.environ.get('key')

1
2
3
>>> import os
>>> os.environ.get('JAVA_HOME')
'C:\\Program Files\\Java\\jdk1.8.0_201'

获得当前目录 getcwd

os.getcwd()

1
2
3
>>> import os
>>> os.getcwd()
'C:\\Users\\pr919'

列出目录 listdir、walk

os.listdir(path),单层列出;path可以是绝对路径或相对路径,不填默认当前目录

os.walk(path),遍历列出;

listdir() 列出path下一层的目录和文件,不包括子目录

>>> import os
>>> os.listdir()
>>> os.listdir(r'D:\---Programming---\Python\Python')
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python-3.8.3-amd64.exe', 'python.exe', 'python3.dll', 'python38.dll', 'pythonw.exe', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll', 'vcruntime140_1.dll']

>>> for i in os.listdir(r'D:\---Programming---\Python\Python'):
...     print(i)
...
DLLs
Doc
include
Lib
libs
LICENSE.txt
NEWS.txt
python-3.8.3-amd64.exe
python.exe
python3.dll
python38.dll
pythonw.exe
Scripts
tcl
Tools
vcruntime140.dll
vcruntime140_1.dll

walk() 列出path下的目录和文件,包括子目录

import os

cwd = os.getcwd()
for i in os.walk(cwd):
    print(i, end='\n\n')

--------------------------------------------------

# Output:
('D:\\Project', 
 ['weather', '__pycache__'], 
 ['app.config', 'io.txt', 'mo.py', 'mo2.py', 'my.log', 'test.py'])

('D:\\Project\\weather',
 ['.idea', '__pycache__'],
 ['city_code.csv', 'city_code.txt', 'query.py', 'Ui_weather.py', 'weather.py', 'weather.ui'])

('D:\\Project\\weather\\.idea',
 ['inspectionProfiles'],
 ['misc.xml', 'modules.xml', 'weather.iml', 'workspace.xml'])

('D:\\Project\\weather\\.idea\\inspectionProfiles',
 [],
 ['Project_Default.xml'])

('D:\\Project\\weather\\__pycache__',
 [],
 ['query.cpython-37.pyc', 'Ui_weather.cpython-37.pyc'])

('D:\\Project\\__pycache__',
 [],
 ['mo.cpython-38.pyc', 'Person.cpython-38.pyc'])

os.walk(path)返回的是一个生成器 generator

每次返回一个元组,元组中共有三个元素:(root, dirs, files)

  1. 第一个root是一个string,表示当前层的 路径
  2. 第二个dirs是一个list,表示当前层 拥有的目录
  3. 第三个files是一个list,表示当前层 拥有的文件

创建目录 mkdir、makedirs

os.mkdir(path)创建单层目录;path可以是相对路径或绝对路径

如果目录已存在,会抛出FileExistsError错误。

1
2
3
4
# 标准创建目录流程
dirpath = 'iodir'
if not os.path.exists(dirpath):
    os.mkdir(dirpath)

os.makedirs(dir/subdir)创建多层目录

如果目录已存在,会抛出FileExistsError错误。

1
2
3
4
# 创建多层目录
dirpath = 'iodir/subiodir'
if not os.path.exists(dirpath):
    os.makedirs(dirpath)

删除目录 rmdir、shutil.rmtree

os.rmdir(path)删除空目录;path可以说相对路径或绝对路径

如果目录不存在,会抛出FileNotFoundError错误。

如果目录不为空,会抛出OSError错误。

# 标准删除目录流程
import os

dirpath = 'iodir'
if os.path.exists(dirpath):
    os.rmdir(dirpath)

--------------------------------------------------

# Output:
没任何输出删除目录成功

目录下不为空输出
Traceback (most recent call last):
  ...
OSError: [WinError 145] 目录不是空的: 'iodir'

shutil,rmtree(path)删除非空目录

如果目录不存在,会抛出FileNotFoundError错误。

iodir下有一个io.txt文件,执行shuitl.rmtree()如下

import os, shuitl

dirpath = 'iodir'
if os.path.exists(dirpath):
    shuitl.rmtree(dirpath)

--------------------------------------------------

# Output:
没任何输出删除目录成功

目录不存在输出
Traceback (most recent call last):
  ...
FileNotFoundError: [WinError 3] 系统找不到指定的路径: 'iodir'

删除文件

os.remove(filename)删除单个文件

1
2
3
4
5
import os

filename = 'io.txt'
if os.path.exists(filename):
    os.remove(filename)

路径拼接 join

os.path.join()

不用的操作系统路径分隔符是不同的

例如在windows下是\,在Linux/Unix/Mac OS X下是/

所以保险起见,在拼接路径的时候用os提供的os.path.join()函数。

这样在不同操作系统中运行代码的时候都可以得到正确的路径拼接。

import os

dir = os.path.join('gpdir', 'padir', 'subdir')
print(dir)

--------------------------------------------------

# Output in windows:
gpdir\padir\subdir

# Output in Linux/Unix
gpdir/padir/subdir

路径拆分 split

os.path.split()

返回值是一个 双元素元组,第一个元素是路径的前部分,第二个元素是最后级别的目录或文件名

1
2
3
4
5
>>> os.path.split('gpdir\padir\subdir')
('gpdir\\padir', 'subdir')

>>> os.path.split('gpdir/padir/subdir')
('gpdir/padir', 'subdir')

获取文件扩展名 splitext

os.path.splitext()

返回值是一个 双元素元组,第一个元素是路径前部分,第二个元素是最后级别文件的扩展名

>>> os.path.splitext('gpdir/padir/subdir/io.txt')
('gpdir/padir/subdir/io', '.txt')

>>> os.path.splitext('gpdir/padir/subdir')
('gpdir/padir/subdir', '')

>>> os.path.splitext('gpdir\padir\subdir\io.txt')
('gpdir\\padir\\subdir\\io', '.txt')

>>> os.path.splitext('gpdir\padir\subdir')
('gpdir\\padir\\subdir', '')

文件、目录重命名

os.rename(oldName, newName)

可以对文件或目录进行重命名

1
2
3
>>> .rename('testdir', 'newtestdir')

>>> os.rename('test.txt', 'iotest.py')

判断是目录还是文件

os.path.isdir(path)

os.path.isfile(path)

示例

列出当前目录下所有目录

>>> [x for x in os.listdir() if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.vim', 'Applications', 'Desktop', ...]

列出当前目录下所有.py文件

>>> [x for x in os.listdir() if os.path.isfile(x) and os.path.splitext(x)[1] == '.py']
['apis.py', 'config.py', 'models.py', 'test_db.py', 'urls.py', 'wsgiapp.py']