Python程序设计 内置模块 系统操作

系统操作

1. os 模块

Python 的 os 模块封装了常见的文件和目录操作,本文只列出部分常用的方法,更多的方法可以查看官方文档

1.1 os.path常见用法

os.path 模块是跨平台的,即使不打算在平台之间移植自己的程序也应该用 os.path,好处多多。

1.11 目录操作

例子

后文的例子以下面的目录结构为参考,工作目录为 'C:\\Users\\Administrator'

  • os.path.abspath(name) 获取绝对路径
  • os.path.dirname(path) 获取路径
  • os.path.basename(path) 获取文件名或文件夹名
  • os.path.splitext() 分离文件名与扩展名
  • os.path.isfile() 判断给出的路径是否是一个文件
  • os.path.isdir() 判断给出的路径是否是一个目录
  • os.path.split(name) 分割文件名与目录
  • os.path.join(path,name) 连接目录与文件名
  • 第一组 os.path 函数可用于将表示文件名的字符串解析为其组成部分。重要的是要意识到这些功能不依赖于实际存在的路径。

  • os.path.abspath:获取文件或目录的绝对路径

In [4]: os.getcwd()
Out[4]: 'C:\\Users\\Administrator'

In [7]: os.path.abspath('hello.py')
Out[7]: 'C:\\Users\\Administrator\\hello.py'

In [8]: os.path.abspath('.')
Out[8]: 'C:\\Users\\Administrator'
  • os.path.split:分离目录与文件名
  • split() 函数将路径分成两个独立的部分,并返回一个tuple结果。第二个元素是路径的最后一个元素,第一个元素是它之前的所有元素。
  • join() 函数能将两个或者多个独立部分,拼接为一个路径.
In [9]: os.path.split(os.path.abspath('.'))
Out[9]: ('C:\\Users', 'Administrator')

In [11]: os.path.join('C:\\Users', 'Administrator')
Out[11]: 'C:\\Users\\Administrator'
  • os.path.splitext:分离文件名与扩展名

splitext()类似于split(),但在扩展分隔符上划分路径,而不是目录分隔符。

In [17]: os.path.splitext('filename.txt')
Out[17]: ('filename', '.txt')

案例二:

在测试文件夹下, 给所有的 txt 文件前加上前缀 [前缀] 两个字

1.12 检查路径
  • os.path.dirname:获取文件或文件夹的路径
In [7]: os.path.dirname('C:\\Users\\Administrator\\hello.py')
Out[7]:'C:\\Users\\Administrator'

In [8]: os.path.dirname('C:\\Users\\Administrator\\python')
Out[8]: 'C:\\Users\\Administrator'

In [9]: os.path.dirname('C:\\Users\\Administrator')
Out[9]: 'C:\\Users'
  • os.path.basename:获取文件名或文件夹名
In [10]: os.path.basename('C:\\Users\\Administrator\\hello.py')
Out[10]: 'hello.py'

In [11]: os.path.basename('/Users/ethan/coding/python')
Out[11]: 'python'
  • os.path.isfile/os.path.isdir
In [17]: os.path.isfile('C:\\Users\\Administrator\\hello.py')
Out[17]: True

In [18]: os.path.isfile('C:\\Users\\Administrator\\hello1.py')
Out[18]: False

In [20]: os.path.isdir('C:\\Users\\Administrator\\hello1.py')
Out[20]: False

In [21]: os.path.isdir('C:\\Users\\Administrator')
Out[21]: True

案例三:

显示当前目录中所有的目录

In [12]: [x for x in os.listdir('.') if os.path.isdir(x)]
方法说明
os.mkdir创建目录
os.rmdir删除目录
os.rename重命名
os.remove删除文件
os.getcwd获取当前工作路径
os.path.join连接目录与文件名
os.path.split分割文件名与目录
os.path.abspath获取绝对路径
os.path.dirname获取路径
os.path.basename获取文件名或文件夹名
os.path.splitext分离文件名与扩展名
os.path.isfile判断给出的路径是否是一个文件
os.path.isdir判断给出的路径是否是一个目录
1.2 os常见用法
  • os.mkdir(name) 创建目录
  • os.rmdir(name) 删除目录
  • os.rename(name) 重命名
  • os.remove(file) 删除文件
  • os.getcwd() 获取当前工作路径
  • os.chdir() 修改当前工作目录

os.mkdir

创建文件目录。

In [4]: os.mkdir(os.path.join(os.path.abspath('.'), 'testdir'))

os.rmdir

删除文件目录。

In [6]: os.rmdir(os.path.join(os.path.abspath('.'), 'testdir'))

os.rename

重命名文件。如果文件不存在则报错

In [10]: os.rename('test.txt', 'test.py')

os.remove

删除文件,文件不存在时报错

In [13]: os.remove('test.py')

os.getcwd

显示当前程序的工作目录

In [2]: os.getcwd()
Out[2]: 'C:\\Users\\Administrator'

os.chdir

改变程序的工作目录

In [2]: os.getcwd()
Out[2]: 'C:\\Users\\Administrator'
In [3]: os.chdir('C:\\')
In [4]: os.getcwd()
Out[4]: 'C:\\'

2. sys模块

系统自身的一些操作

sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:Python解释器。与os模块相比,其更多的在于针对系统环境的交互,而os则操作文件目录。

2.1 导入sys模块

首先,打开终端模拟器进入Python解释器或者打开IDE编辑器创建一个新的.py后缀名的Python程序文件。 下面,以解释器中的操作举例:

>>> import sys #导入sys模块
>>> dir(sys)     #dir()方法查看模块中可用的方法
2.2 sys模块常见函数

了解

  • sys.argv: 命令行参数,包括脚本名称,实现从程序外部向程序传递参数
  • sys.exit([arg]): 程序中间的退出,arg=0为正常退出
  • sys.path: 查找模块所在目录的目录名列表
  • sys.modules:映射模块名字到载入模块的字典
  • sys.platform: 获取当前系统平台
  • sys.stdin:标准输入流-一个类文件(file-like)对象
  • sys.stdout:标准输出流-一个类文件对象
  • sys.stderr:标准错误流-一个类文件对象
  • sys.getdefaultencoding(): 获取系统当前编码,一般默认为ascii。
  • sys.setdefaultencoding(): 设置系统默认编码,需要reload(sys)才能查询看到
  • sys.getfilesystemencoding(): 获取文件系统使用编码方式,Windows下返回’mbcs’,mac下返回’utf-8’
2.21 SYS.ARGV

sys.argv是命令行参数,包括脚本名称,它的功能可以实现从程序外部向程序传递参数。那么这个过程是如何实现的呢?假设有一个名为test.py的文件,则可以通过import sysprint sys.argv[number]两句来实现。number=0为这个脚本的名字,1,2,…则为命令行下传递的参数。

如test.py脚本内容如下:

import sys

print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])
print(sys.argv[3])

那么要实现参数传递即可采用>>>python test.py arg1 arg2 arg3实现。下文会结合sys.path给出一个示例。上述命令的输出结果为:

test.py
arg1
arg2
arg3
2.22 SYS.EXIT([ARG])

执行至主程序的末尾时,解释器会自动退出。但如果需要中途退出程序,可以调用sys.exit()函数来实现。它带有一个可选的整数参数返回给调用它的程序。这意味着你可以在主程序中捕获对sys.exit()的调用。(0为正常退出,其他为不正常,可抛异常事件供捕获)

sys.exit()函数运行示例如下:

import sys

sys.exit(1) # 直接退出程序

print('hello')
2.23 SYS.PATH

sys.path的功能是获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到。

示例:

In [1]: import sys

In [2]: sys.path
Out[2]:
['',
 'C:\\paisen\\Anaconda3\\Scripts',
 'C:\\paisen\\Anaconda3\\python36.zip',
 'C:\\paisen\\Anaconda3\\DLLs',
 'C:\\paisen\\Anaconda3\\lib',
 'C:\\paisen\\Anaconda3',
 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python36\\site-packages',
 'C:\\paisen\\Anaconda3\\lib\\site-packages',
 'C:\\paisen\\Anaconda3\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg',
 'C:\\paisen\\Anaconda3\\lib\\site-packages\\pip-10.0.1-py3.6.egg',
 'C:\\paisen\\Anaconda3\\lib\\site-packages\\win32',
 'C:\\paisen\\Anaconda3\\lib\\site-packages\\win32\\lib',
 'C:\\paisen\\Anaconda3\\lib\\site-packages\\Pythonwin',
 'C:\\paisen\\Anaconda3\\lib\\site-packages\\IPython\\extensions',
 'C:\\Users\\Administrator\\.ipython']

可以采用sys.path.append("自定义模块路径")增加模块搜索路径(也可以用sys.path.insert进行列表插入)。以上列出的模块目录,在python执行import module_name时,会依次从上述列出的路径来搜索对应的模块。如有需要手动添加模块,可放入对应的路径中,如无必要建议不要手动添加路径。. 代表当前文件目录。

上问提到的sys.argv参数传递示例如下:

输入:

import sys


print('当前 Python PATH 路径有以下内容:')
for path in sys.path:
    print(path)

输出:

当前 Python PATH 路径有以下内容:
F:\进阶部分
F:\进阶部分
C:\paisen\Anaconda3\python36.zip
C:\paisen\Anaconda3\DLLs
C:\paisen\Anaconda3\lib
C:\paisen\Anaconda3
C:\Users\Administrator\AppData\Roaming\Python\Python36\site-packages
C:\paisen\Anaconda3\lib\site-packages
C:\paisen\Anaconda3\lib\site-packages\setuptools-39.1.0-py3.6.egg
C:\paisen\Anaconda3\lib\site-packages\pip-10.0.1-py3.6.egg
C:\paisen\Anaconda3\lib\site-packages\win32
C:\paisen\Anaconda3\lib\site-packages\win32\lib
C:\paisen\Anaconda3\lib\site-packages\Pythonwin
C:\Program Files\JetBrains\PyCharm 2018.2.5\helpers\pycharm_matplotlib_backend
2.24 SYS.MODULES

下面部分内容均为演示

sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当导入新的模块时,sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。它拥有字典所拥有的一切方法。

示例:

import sys

print(sys.modules.keys())  # 列出所有的模块名
print(sys.modules['os'])  # 列出指定模块如os模块所在路径
print(sys.modules.values())  # 列出所有模块所在路径
2.25 SYS.PLATFORM

sys.platform语句用于查看当前平台,如win32、linux2等。

In [28]: sys.platform
Out[28]: 'win32'
2.26 标准数据流

sys.stdin/sys.stdout/sys.stderr变量包含与标准I/O流对应的流对象。如果需要更好地控制输出,而print不能满足你的要求,它们就是你所需要的。你也可以替换它们,这时候你就可以重定向输出和输入到其它设备( device ),或者以非标准的方式处理它们。

我们平时的输入输出方式通过input/print实现,即

print('Hello World!')
print('Hi, %s!' % input('Please enter your name:'))

上述中,键盘键入的信息则为标准输入,屏幕输出的结果则为标准输出。而上述的例子,与下文采用sys.stdin/sys.stdout的结果是一致的。

import sys

sys.stdout.write('Hello World!')

print('请输入你的名字:')
name = sys.stdin.readline()[:-1]
print('Hi, %s!' % name)

输入for f in (sys.stdin, sys.stdout, sys.stderr): print(f)可查看属性信息。

In [4]: for f in (sys.stdin, sys.stdout, sys.stderr): print(f)
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>

注:通过IPython输出结果与上述有所出入,但上述要表述的信息正确。

stdin/stdout/stderr在Python中都是文件属性的对象,在Python启动时自动与Shell 环境中的标准输入/输出/出错关联。与标准输出print和标准出错所不同的是,stdin/stdout/stderr三者不具备自动回车功能,而标准输入输出则默认自动加了回车。stdin只读,stdout和stderr只写。

使用sys重定向输出

代码如下:

print('Dive in')  # 标准输出
saveout = sys.stdout  # 终在重定向前保存stdout,这样的话之后你还可以将其设回正常
fsock = open('out.log', 'w')  # 打开一个新文件用于写入。如果文件不存在,将会被创建。如果文件存在,将被覆盖。
sys.stdout = fsock  # 所有后续的输出都会被重定向到刚才打开的新文件上。
print('This message will be logged instead of displayed')  # 这样只会将输出结果“打印”到日志文件中;屏幕上不会看到输出
sys.stdout = saveout  # 在我们将 stdout 搞乱之前,让我们把它设回原来的方式。
fsock.close()  # 关闭日志文件。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值