Python 学习8 --文件管理&模块与包

来源:互联网 发布:打电话l录音软件 编辑:程序博客网 时间:2024/06/03 18:42

思维导图

这里写图片描述
这里写图片描述

文件的管理

文件管理的三大步骤:

  • 打开文件; f = open(“filename”)
  • 处理文件;
    f.read() # 可以读取文件内容
    f.write(“hello”) # 不能往文件中写入,因为默认文件以r的模
  • 关闭并保存文件; f.close()

文件的几种模式总结:

r模式:

若文件不存在,直接报错;
文件只能读取,不能写入;

w模式:

若文件不存在,直接创建文件;
文件只能写入,不能读取;
打开文件时会清空原有文件内容;

r+模式:

若文件不存在,直接报错;
文件可以读也可以写;
具体写入的内容在哪里,由文件指针(句柄)决定;

w+模式:

若文件不存在,直接创建文件;
文件既能写入也能读取;
打开文件时会清空原有文件内容;

a

若文件不存在,直接创建文件;
文件只能写入,不能读取;
写入的内容直接追加到文件最后;

a+

若文件不存在,直接创建文件;
文件既能写入也能读取;
写入的内容直接追加到文件最后;

b

以二进制的方式打开文件,可以跟r,w,+等组合使用;

文件的读取

read() # 直接读取文件所有内容;
readline() # 每次读取文件一行内容,返回类型为字符串;
readlines() # 读取文件所有内容,以列表形式返回;
xreadlines() # 类似生成器,文件内容不直接以列表方式返回;

文件的写入

write(“str”) # 将字符串写入文件
writelines(“[“hello\n”,”world\n”]”) # 将序列的每个元素写入文件;

文件的其它操作

f.seek(偏移量,选项)
# 偏移量,如果为正数,代表向右偏移;如果为负数,代表向左偏移;
# 选项,如果为0,指针指向文件开始;
如果为1,指针指向当前位置;
如果为2,指针指向文件末尾;
f.flush() # 提交对文件的修改;

文件的几个注意点:

  • 文件对象是可迭代数据类型,可以通过for遍历文件的内容;
  • with open(“filename”) as f:通过这种方法来避免用户忘记关闭文件的问题;

练习题:

  • 显示文件的所有行,但忽略以#开头的行;
#!/usr/bin/env python#coding:utf-8f = open("hello.txt",'r')for line in f.xreadlines():    if line.strip()[0] != "#":        print  line,f.close()
  • 逐页显示文本文件的程序,用户输入一个文件名,每次默认显示行数为10行,给用户一个选项,”是否继续?(Y|N)”
#!/usr/bin/env python#coding:utf-8file = raw_input("FileName:").strip()f = open(file,'r')while True:    lines = 0       # 显示文件已经显示行数    for line in range(10):      # 每次读取的文件行数        cline = f.readline()        if cline:            lines += 1            print cline,    if lines < 10:        print "\n file over!"        break    choice = raw_input("Continue(Y|N)").upper()    if choice == "N":        breakf.close()

模块与包的管理

模块

  • 模块实质上就是一个以.py结尾的文件,可以被其他py文件调用;
  • 导入模块时,会去python的默认搜索路径中寻找;
  • python的默认搜索路径sys.path,
  • 添加自定义的搜索路径时,sys.path是一个列表,sys.apth.append(“path”);
    - sys.path.append(“/home/kiosk/1-Pythonv3/day08/code”)
    - sys.path.insert(0,’/home/kiosk’)
  • 导入一个模块的实质是将模块的文件重新运行一次;
  • 导入模块的方法:
    import module1,module2
    from 模块名 import 函数名
    from 模块名 import 函数名 as 函数别名
    import 模块名 as 函数别名

  • 导入一个包的实质是运行包里面的init.py文件;
  • 导入包的方法:
    import 包名.模块名
    from 包名 import 模块名
    import 包名(注意init.py函数的内容)

模块分类:

- 内置模块(os,sys,time)- 自定义模块- 第三方模块

常用的内置模块

os , sys , time , datetime , json/pickle , shutil ,random

os

os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。

  1. os.name——判断现在正在实用的平台,Windows 返回 ‘nt’; Linux 返回’posix’

  2. os.mkdir()——创建目录

  3. os.makedirs()——递归建立目录

  4. os.remove()——删除指定文件

  5. os.chdir()——改变目录到指定目录

  6. os.getcwd()——得到当前工作的目录

  7. os.listdir()——指定所有目录下所有的文件和目录名
    这里写图片描述

  8. os.path.isfile()——判断指定对象是否为文件;是返回True,否则False

  9. os.path.isdir()——判断指定对象是否为目录;是返回True,否则False
    这里写图片描述

  10. os.path.split()——返回路径的目录和文件名
    这里写图片描述

  11. os.system()——执行shell命令
    这里写图片描述

  12. os.path.join(path, name)——连接目录和文件名
    这里写图片描述

  13. os.path.basename(path)——返回文件名

  14. os.path.dirname(path)——返回文件路径

sys

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分

  1. sys.argv() : 在外部向程序内部传递参数
    这里写图片描述

  2. sys.exit(n) :执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)
    这里写图片描述

  3. sys.path :环境变量,即获取指定模块搜索路径的字符串集合(显示的信息实际为一个列表,可以通过append()命令增加搜索目录)
    这里写图片描述

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

  5. sys.getdefaultencoding() : 获取系统当前编码,一般默认为ascii。

  6. sys.setdefaultencoding() : 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行setdefaultencoding(‘utf8’),此时将系统默认编码设置为utf8。(见设置系统默认编码 )

  7. sys.getfilesystemencoding() : 获取文件系统使用编码方式,Windows下返回’mbcs’,mac下返回’utf-8’.

  8. sys.platform: 获取当前系统平台。

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

time

在实际的编程中我们要经常与时间打交道,所以time模块是非常有用的,在python中,对时间的处理并不只有time,还有datetime和calendar,locale。

  1. time.localtime([secs]) :将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。

  2. time.time():返回当前时间的时间戳。
    这里写图片描述
    这里写图片描述

  3. time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。

  4. time.mktime(t):将一个struct_time转化为时间戳。

time.mktime(time.localtime())1304576839.0
  1. time.sleep(secs):线程推迟指定的时间运行。单位为秒。

time.clock():这个需要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间

import time  if __name__ == '__main__':      time.sleep(1)      print "clock1:%s" % time.clock()      time.sleep(1)      print "clock2:%s" % time.clock()      time.sleep(1)      print "clock3:%s" % time.clock()

运行结果:

clock1:3.35238137808e-006
clock2:1.00005142763
clock3:2.00011843636

其中第一个clock()输出的是程序运行时间
第二、三个clock()输出的都是与第一个clock的时间间隔

  1. time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:’Sun Jun 20 23:21:05 1993’。如果没有参数,将会将time.localtime()作为参数传入。
time.asctime()'Thu May 5 14:55:43 2011'
  1. time.ctime([secs]):把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
time.ctime()'Thu May 5 14:58:09 2011'
time.ctime(time.time())'Thu May 5 14:58:39 2011'
time.ctime(1304579615)'Thu May 5 15:13:35 2011'

datetime

datetime模块提供对于日期和时间进行简单或复杂的操作. datetime 模块提供了以下的可用类型

datetime模块定义了两个常量:datetime.MINYEAR和datetime.MAXYEAR,分别表示datetime所能表示的最小、最大年份。其中,MINYEAR = 1,MAXYEAR = 9999。

  1. datetime.date: 一个理想化的日期, 提供year, month, day属性
  2. datetime.time: 一个理想化的时间, 提供hour, minute, second, microsecond, tzinfo.
  3. datetime.datetime: 日期和时间的组合.提供year, month, day, hour, minute, second, microsecond, tzinfo.
  4. datetime.timedelta: 表达两个date,time和datetime持续时间内的微妙差异.
  5. datetime.tzinfo: 时间对象的抽象基类.

json/pickle

json和pickle模块,两个都是用于序列化的模块

  • json模块,用于字符串与python数据类型之间的转换

  • pickle模块,用于python特有类型与python数据类型之间的转换

两个模块,都提供了dumps,dump,loads,load 4个功能

json.loads() : loads 由字符串转其他数据类型
json.load() : 将文档(内部是字符串格式)转换成python的其他数据类型
json.dumps() : 将字典、列表、元组 转换成字符串格式
json.dump() : 将字典、元组、列表转换成字符串格式并写入文档

注意 dump load 不要一起运行,会报错,一步一步来

shutil

在看django和scrapy源码的时候,可以看见他会有一个模式,即先有一些模块文件,在他的源码中,当你使用他规定的命令的时候,就会复制这些文件,来生成你要的模板文件。这里就是用了python自带的shutil模块。

  1. shutil.copyfile( src, dst) : 从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉

  2. shutil.move( src, dst) : 移动文件或重命名

  3. shutil.copymode( src, dst) : 只是会复制其权限其他的东西是不会被复制的

  4. shutil.copystat( src, dst) : 复制权限、最后访问时间、最后修改时间

  5. shutil.copy( src, dst) : 复制一个文件到一个文件或一个目录

  6. shutil.copy2( src, dst) : 在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西

  7. shutil.copy2( src, dst) : 如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作

  8. shutil.copytree( olddir, newdir, True/Flase) :
    把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接

  9. shutil.rmtree( src ) : 递归删除一个目录以及目录内的所有内容

random

random模块用于生成随机数

  1. random.random() : 用于生成一个0到1的随机符点数: 0 <= n < 1.0

  2. random.uniform(a, b) : 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a < b, 则 b <= n <= a。

  3. random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

  4. random.randrange([start], stop[, step]) : 从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, … 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。

  5. random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。

  6. random.shuffle(x[, random]) : 用于将一个列表中的元素打乱

  7. random.sample(sequence, k) : 从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。

进程管理

练习:读取负载信息

分析:

/proc文件系统是一个虚拟的文件系统,不占用磁盘空间,它反映了当前操作系统在内存中的运行情况,查看/proc下的文件可以聊寄到系统的运行状态。查看系统平均负载使用“cat /proc/loadavg”命令,输出结果如下:
0.27 0.36 0.37 4/83 4828/
前三个数字大家都知道,是1、5、15分钟内的平均进程数(有人认为是系统负荷的百分比,其实不然,有些时候可以看到200甚至更多)。后面两个呢,一个的分子是正在运行的进程数,分母是进程总数;另一个是最近运行的进程ID号。

程序

#!/usr/bin/env python  import osdef load_stat():    loadavg = {}    f = open("/proc/loadavg")    con = f.read().split()    f.close()    loadavg['lavg_1']=con[0]    loadavg['lavg_5']=con[1]    loadavg['lavg_15']=con[2]    loadavg['nr']=con[3]    loadavg['last_pid']=con[4]    return loadavgprint "loadavg",load_stat()['lavg_15']

运行结果
这里写图片描述

练习:
备份/home目录,备份的包名称为homeback_YY_MM_DD.tar.gz
程序:

import shutilimport timeshutil.make_archive('homeback%s'%(time.strftime('%Y_%m_%d')),'gztar','/home')print 'homeback%s'%(time.strftime('%Y_%m_%d'))print time.strftime('%Y_%m_%d')

运行结果:
这里写图片描述

原创粉丝点击