如果我们要操作文件,目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如ls,cp等命令

  如果要在python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令指示简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数

  打开Python交互式命令行,我们来看看如何使用os模块的基本功能:

>>> import os
>>> os.name
'posix'

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

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

>>> os.uname()
posix.uname_result(sysname='Linux', nodename='prd-zabbix', release='3.10.0-862.el7.x86_64', version='#1 SMP Fri Apr 20 16:44:24 UTC 2018', machine='x86_64')

  环境变量

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

>>> os.environ
environ({'XDG_SESSION_ID': '12832', 'HOSTNAME': 'prd-zabbix', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'HISTSIZE': '1000', 'SSH_CLIENT': '192.168.1.149 50998 22', 'CONDA_SHLVL': '1', 'CONDA_PROMPT_MODIFIER': '(base) ', 'SSH_TTY': '/dev/pts/0', 'USER': 'root', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:', 'CONDA_EXE': '/root/anaconda3/bin/conda', '_CE_CONDA': '', 'MAIL': '/var/spool/mail/root', 'PATH': '/root/anaconda3/bin:/root/anaconda3/condabin:/usr/local/redis-4.0.9/src:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/rabbitmq/bin:/usr/local/jdk1.8.0_171/bin:/usr/local/nginx/sbin:/root/bin:/root/bin:/usr/local/python3/bin', 'CONDA_PREFIX': '/root/anaconda3', 'PWD': '/root', 'JAVA_HOME': '/usr/local/jdk1.8.0_171', 'LANG': 'zh_CN.UTF-8', '_CE_M': '', 'HISTCONTROL': 'ignoredups', 'SHLVL': '1', 'HOME': '/root', 'LOGNAME': 'root', 'CLASSPATH': '/usr/local/jdk1.8.0_171/lib/', 'SSH_CONNECTION': '192.168.1.149 50998 172.16.40.232 22', 'CONDA_DEFAULT_ENV': 'base', 'LESSOPEN': '||/usr/bin/lesspipe.sh %s', 'XDG_RUNTIME_DIR': '/run/user/0', '_': '/root/anaconda3/bin/python3'})

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

>>> os.environ.get('PATH')
'/root/anaconda3/bin:/root/anaconda3/condabin:/usr/local/redis-4.0.9/src:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/rabbitmq/bin:/usr/local/jdk1.8.0_171/bin:/usr/local/nginx/sbin:/root/bin:/root/bin:/usr/local/python3/bin'

  操作文件和目录

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

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

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

>>> os.path.join('part-1','part-2')
'part-1/part-2'

  而在Windows下回返回这样的字符串

part-1\part-2

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

>>> os.path.split('/root/testdir')
('/root', 'testdir')
>>> os.path.split('/root/testdir/test.txt')
('/root/testdir', 'test.txt')

  os.path.splitext()可以直接让你得到文件扩展名,很多时候非常方便:

>>> os.path.splitext('/root/testdir/test.txt')
('/root/testdir/test', '.txt')

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

  文件操作使用下面的函数。假定当前目录下有一个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)]

  os.path.isdir(x)判断是否为目录,返回True或者False

  要列出所有的.py文件,也只需一行代码

[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

  os.path.isfile(x)判断是否文件 os.path.splitext(x)[1]=='.py'判断后缀为py

  

  练习

  1.利用os模块编写一个能实现dir -l输出的程序

  2.编写一个程序,能在当前目录以及当前目录所有子目录下查找包含特定字符串的文件,并打印出相对路径

  练习1 do_dir.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*- from datetime import datetime
import os #获取当前绝对路径,返回为字符串str
pwd = os.path.abspath('.') print(' Size Last Modified Name')
print('------------------------------------------------------------') #os.listdir(pwd)列出当前路径下所有文件和文件夹,结果为列表
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如果是文件夹则加/显示,否则是文件则flag为空
flag = '/' if os.path.isdir(f) else ''
#格式化输出%10d代表输出10位,右对齐不足10位的左边加空格补齐
print('%10d %s %s%s' % (fsize, mtime, f, flag))

  运行结果如下

(base) [root@prd-zabbix io]# python3 do_dir.py
Size Last Modified Name
------------------------------------------------------------
331 2019-07-08 09:32 do_bytesio.py
379 2019-07-08 09:32 do_stringio.py
673 2019-07-08 09:32 use_json.py
180 2019-07-08 09:32 use_pickle.py
386 2019-07-08 09:32 with_file.py
20 2019-07-13 10:20 test.txt
91402 2019-07-10 15:20 test.jpg
13 2019-07-10 15:43 gbk.txt
1917 2019-07-10 17:36 StringIO_BytesIO.py
22 2019-07-13 13:45 test/
1455 2019-07-13 11:11 search_file.py
248 2019-07-13 13:53 findstr.py
464 2019-07-13 15:14 do_dir2.py
12288 2019-07-13 16:14 .do_dir.py.swp
840 2019-07-13 16:13 do_dir.py

  查找目录下包含指定字符串的文件夹及文件并打印出来

  findstr.py

import os
#定义函数包含两个参数p为查找路径,str为需要查找包含的字符
def findstr(p,str):
#遍历路径下文件夹和文件
for x in os.listdir(p):
#拼接成完整路径+文件名
path=os.path.join(p,x)
#如果是文件并且查找的字符串包含在文件里则打印
if os.path.isfile(path) and str in x:
print(path)
#如果是文件夹则递归再次调用函数
if os.path.isdir(path):
findstr(path,str) findstr('test','test')

Python3 IO编程之操作文件和目录的更多相关文章

  1. IO编程、操作文件或目录、序列化、JSON

    IO中指Input/Output,即输入和输出:涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口 1.由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,存在速度严重不匹配问题.eg ...

  2. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

    IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...

  3. 【Python】[IO编程]文件读写,StringIO和BytesIO,操作文件和目录,序列化

    IO在计算机中指Input/Output,也就是输入和输出. 1.文件读写,1,读文件[使用Python内置函数,open,传入文件名标示符] >>> f = open('/User ...

  4. IO编程(2)-操作文件和目录

    操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...

  5. python的I/O编程:文件打开、操作文件和目录、序列化操作

    1 文件读写 1.1 打开文件: open(r'D:\text.txt') 1.2 文件模式 值 功能描述 'r' 读模式 'w' 写模式 'a' 追加模式 'b' 二进制模式 '+' 读写模式 1. ...

  6. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. 使用File类操作文件或目录的属性

    在学I/O流之前,我先总结一下使用File类操作文件或目录的属性. package com.File; import java.io.File; import java.io.IOException; ...

  8. (三)linux 学习 --操作文件和目录

    The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap05.html 文章目录 通配符 字符范围 ` ...

  9. Python操作文件和目录

    Python操作文件和目录 读写文件比较简单,有一点特别注意就好了 windows下Python默认打开的文件以gbk解码,而一般我们的文件是utf-8编码的,所以如果文本含有中文,就会出现异常或者乱 ...

随机推荐

  1. Codeforces Global Round 6[A,B,C]

    题意:给一个字符串,对它重新排列使得它是60的倍数. 模拟一下,需要能整除60  字符串中需要 能整除2 3 10,所以需要字符串各位数之和能整除3 并且有 一个偶数和一个0  或者两个0也行[没考虑 ...

  2. 2019/7/18 --1.<%@ include file=""%>与<jsp:include page=""/>两种方式的作用

    一.前言 身为一名coder有太多太多的知识点要去学,太多太多的东西要去记.往往一些小细节也就难免疏忽,但悲催的是多数困恼你的bug就是因为这些微不足道的知识点.我们又不是机器人,怎么可能什么都记得了 ...

  3. am335x system upgrade kernel i2c rtc eeprom(六)

    1      Scope of Document This document describes i2c bus hardware design and support i2c-devices: ee ...

  4. C二维字符数组的使用及如何获取二维数组的总行数和总列数!

    #include <stdio.h> #include <stdlib.h> int main(){ char str[][30] = {"zhangsan" ...

  5. 想学习找不到好的博客?看这里>>

    想学习找不到好的博客?看这里>> (ps:内容 + 作者) 基础数论知识整理--gyh 进阶数论知识整理--又是gyh 关于SPFA--lyj(终于不是gyh) 证明二次探测定理-Line ...

  6. Out of memory: Kill process 6033 (mysqld) score 85 or sacrifice child

    进入正题前先说明:OOM killer什么时候出现? linux下允许程序申请比系统可用内存更多的内存,这个特性叫Overcommit.这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用 ...

  7. linux服务器时间乱码问题解决

    问题现象如下: [root@ip-171-21-36-129 testcase]# date 2019Ū 08Ղ 02ɕ чǚϥ 09:44:48 UTC 解决步骤: 1.执行命令:vi /etc/s ...

  8. Lombok:小辣椒的安装与使用

    0.简介 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具, 通过使用对应的注解,可以在编译源码的时候生成对应的方法,官网有详细的使用说明和视频. ...

  9. fmex挂单挖矿

    最近fmex上线挂单挖矿,针对挂单写了个程序,"跟随盘口,避免成交",0成本薅羊毛. 代码在 https://github.com/xiaoxiaoleo/fmexminer 使用 ...

  10. Python_Openpyxl 浅谈(最全总结 足够初次使用)

    https://blog.csdn.net/weixin_43094965/article/details/82226263 import datetime from random import ch ...