Python学习笔记(二十五)操作文件和目录

摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431925324119bac1bc7979664b4fa9843c0e5fcdcf1e000

Python内置的os模块也可以直接调用操作系统提供的接口函数。

>>> import os
>>> os.name # 操作系统类型
‘nt‘

如果是posix,说明系统是LinuxUnixMac OS X,如果是nt,就是Windows系统。

要获取详细的系统信息,可以调用uname()函数:

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

注意uname()函数在Windows上不提供,也就是说,os模块的某些函数是跟操作系统相关的。

环境变量

在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看:

>>> os.environ
environ({‘VERSIONER_PYTHON_PREFER_32_BIT‘: ‘no‘, ‘TERM_PROGRAM_VERSION‘: ‘326‘, ‘LOGNAME‘: ‘michael‘, ‘USER‘: ‘michael‘, ‘PATH‘: ‘/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin‘, ...})

要获取某个环境变量的值,可以调用os.environ.get(‘key‘)

>>> os.environ.get(‘PATH‘)
‘/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin‘
>>> os.environ.get(‘x‘, ‘default‘)
‘default‘

操作文件和目录

操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:

# 查看当前目录的绝对路径:
>>> os.path.abspath(‘.‘)
‘/Users/michael‘
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join(‘/Users/michael‘, ‘testdir‘)
‘/Users/michael/testdir‘
# 然后创建一个目录:
>>> os.mkdir(‘/Users/michael/testdir‘)
# 删掉一个目录:
>>> os.rmdir(‘/Users/michael/testdir‘)

两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下,os.path.join()返回这样的字符串:

part-1/part-2

而Windows下会返回这样的字符串:

part-1\part-2

同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:

>>> os.path.split(‘/Users/michael/testdir/file.txt‘)
(‘/Users/michael/testdir‘, ‘file.txt‘)
os.path.splitext()可以直接让你得到文件扩展名,很多时候非常方便:

>>> os.path.splitext(‘/path/to/file.txt‘)
(‘/path/to/file‘, ‘.txt‘)

这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。

文件操作使用下面的函数。假定当前目录下有一个test.txt文件:

# 对文件重命名:
>>> os.rename(‘test.txt‘, ‘test.py‘)
# 删掉文件:
>>> os.remove(‘test.py‘)

复制文件的函数居然在os模块中不存在!原因是复制文件并非由操作系统提供的系统调用。幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充。

最后看看如何利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:

>>> [x for x in os.listdir(‘.‘) if os.path.isdir(x)]
[‘.lein‘, ‘.local‘, ‘.m2‘, ‘.npm‘, ‘.ssh‘, ‘.Trash‘, ‘.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‘, ‘pymonitor.py‘, ‘test_db.py‘, ‘urls.py‘, ‘wsgiapp.py‘]

小结

Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。

练习

  1. 利用os模块编写一个能实现dir -l输出的程序。
  2. 编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
from datetime import datetime
import os

pwd = os.path.abspath(‘.‘)

print(‘      Size     Last Modified  Name‘)
print(‘------------------------------------------------------------‘)

for f in os.listdir(pwd):
    fsize = os.path.getsize(f)
    mtime = datetime.fromtimestamp(os.path.getmtime(f)).strftime(‘%Y-%m-%d %H:%M‘)
    flag = ‘/‘ if os.path.isdir(f) else ‘‘
    print(‘%10d  %s  %s%s‘ % (fsize, mtime, f, flag))
时间: 2024-08-08 12:16:25

Python学习笔记(二十五)操作文件和目录的相关文章

马哥学习笔记二十五——ISCSI协议,架构及其安装配置

ISCSI监听在tcp/3260端口 iSCSI Target:iscsi-target-utils 客户端认正方式: 1.基于IP 2.基于用户,CHAP tgtadm:命令行工具,模式化命令 --mode 常用模式:target,logicalunit,account target --op new.delete.show.update.bind.unbind logicalunit --op new.delete account --op new.delete.bind.unbind --

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现 这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item. 要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是

angular学习笔记(二十五)-$http(3)-转换请求和响应格式

本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transformRequest: function(data){ //对前台发送的data进行处理 return data } }) 这个在测试的时候遇到了很大的问题.只要经过transformRequest函数处理,哪怕是不做任何处理,node后台都会报错,需要尝试使用php 2. transformResp

Python学习笔记(十五)用Python获取本地数据

f1 = open(r'E:\Python\Data\data1.txt') #读取data1.txt文件,使用系统默认缓冲区大小, 为了读取快点,使用缓存吧! f = open(r'E:\Python\Data\data2.txt', 'w') f.write('Hello World !') f.close() f = open(r'E:\Python\Data\data2.txt', 'r') p1 = f.read(5) # 先读5个字节 p2 = f.read() # 余下的都读出来f

Java基础学习笔记二十五 MySQL

MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 create database 库名 character set 编码 mysql> create database mybase; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+

Python学习笔记(十五)

一.进程与线程 一个操作系统可以有多个进程 一个进程可以有多个线程,且必须有一个线程 二.多进程 from multiprocessing import Process import os # 多进行要运行的函数 def run_proc(name): print("Hello,",name,os.getpid()) if __name__ == "__main__": print("Parent process %s " % os.getpid

python学习笔记-(十五)RabbitMQ队列

rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或者同属于同一父进程下的多个子进程进行交互):如果两个独立的程序,那么之间是不能通过queue进行交互的,这时候我们就需要一个中间代理即rabbitMQ 消息队列: RabbitMQ ZeroMQ ActiveMQ ........... 一. 安装 1. ubuntu下安装rabbitMQ: 1.1 安装: sudo a

Android学习笔记二十五.Service组件入门(三)使用IntentService

使用IntentService 1.Service缺陷 由于Service本身存在以下两个问题: (1)Service不会专门启动一条单独的进程,Service与他所在应用位于同一进程中: (2)Service也不是专门一条新的线程,如果我们在Service中直接处理耗时的任务,那么就会导致应用程序出现假性"卡死".如果我们需要在Service处理耗时任务,也可以在Service的onCreate()方法中启动一条新线程来处理该耗时任务(如上例).但是,问题来了,启动Service的A

[傅里叶变换及其应用学习笔记] 二十五. 线性系统,传递函数,特征值

矩阵卷积,离散有限维线性时不变系统 与上一节课连续无限维线性时不变系统有相同的描述:当且仅当线性算符是用卷积表达的,该系统才是线性时不变系统(LTI system). $\underline{w} = Av = \underline{h}* \underline{v}$ 上述等式表达了离散有限维的线性时不变系统,它能表达成脉冲响应与输入的矩阵乘积,也能表达成矩阵间的卷积. 下面我们通过一个例子加深对线性时不变系统的理解. 例,假设有LTI系统 $\underline{w} = Av = \und

Linux学习笔记<二十五>——openssh服务

ssh:Secure SHell ssh特点: 基于TCP22号端口: 密文认证: 密文传输数据 openssh是ssh的开源实现,支持ssh v1和ssh v2 但ssh v1无法解决中间层攻击,建议不要使用 客户端: Linux:ssh Windows:putty,SecureCRT,SSHSecureShellClient,Xmanager 服务器端: Linux:sshd openssh相关命令 1.ssh -X:enable X11 forwarding -Y:enable trust