Python【No-20】操作文件和目录


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

例如查看当前系统类型

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

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

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

>>> 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

>>> 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')

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

获得当前目录 getcwd

os.getcwd()

>>> 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错误。

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

os.makedirs(dir/subdir)创建多层目录
如果目录已存在,会抛出FileExistsError错误。

# 创建多层目录
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)删除单个文件

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()
返回值是一个双元素元组,第一个元素是路径的前部分,第二个元素是最后级别的目录或文件名

>>> 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)
可以对文件或目录进行重命名

>>> .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']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TCP404

老板大方~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值