Python公开课第五节

来源:互联网 发布:网络时时彩赌博案量刑 编辑:程序博客网 时间:2024/05/17 06:11

文件访问与函数式编程入门

  • 文本文件读写
  • 二进制文件读写
  • 文件和目录操作
  • 序列化与反序列化
  • 高阶函数
  • 匿名函数
  • 装饰类
  • 偏函数

文本文件读写三种方法
第一种方法
直接读入

file1=open('D:\\a.txt','r')file2=open('D:\\b.txt','w')while True:    line=file1.readline()    #在这里可以进行逻辑操作    file2.write('"'+line+'"'+',')    if not line:        break#记住文件处理完,关闭文件是个好习惯file1.close()file2.close()

读文件有三种方法:

  • read()将文本文件所有行读入到字符串中
  • readline()是一行一行的读
  • readlines()将文本文件中的所有行读入到一个list中,文本文件每一行是list的一个元素。优点:readline()可以在读行过程中跳过特定行。

第二种方法
文件迭代器,用for循环的方法

file2=open('D:\\a.txt','w')for line in open('aa.txt'):    files.write('"'+line+'"'+';')file2.close()

第三种方法
文件上下文管理器

#打开文件#用with...open自带关闭文件的功能with open('D:\\a.txt','r') as f:    data=f.read()#loop整个文档with open('D:\\a.txt','r') as f:    for line in f:        #处理每一行#写入文本with open('D:\\a.txt','w') as f:    f.write(text1)    f.write(text2)    ...#把要打印的line写入文件中with open('D:\\a.txt','w') as f:    print(line,file=f)    print(line,file=f)

二进制文件读写
Python磨人的都是文件读写,要是想要读取二进制文件,需要把刚刚的‘r’改成‘rb’。

f=open('D:\\b.PNG','rb')print(f.read())#输出‘\xff\xd8\xff\xel\x00’用十六进制表示的字节

简单说就是,任何非标准的文本文件,(对于py2来说,标准时ascii,对于py3标准是Unicode),你就需要用二进制读入这个文件,你就需要用二进制读入这个文件,然后再用.decode(‘…’)的方法解码这个文件。

f=open('d:\\a.txt','rb')#读入郭德纲老师的作文,但郭老师用的是参合着错别字的繁体编码,假设叫个‘DeYuncode’#那么你读入他们就需要解码它u=f.read().decode('DeYuncode')

文件和目录操作
在图形界面的操作系统下,这个很简单就是右键/拖拽等等。在Python中咋么做?

基本操作
用Python内置的OS直接调用操作系统提供的接口。

import osos.name
'nt'

这里是通过OS告诉我们,我们操做系统的名字。如果是posix,说明系统是#nix族,如果是nt,就是Windows。
我们可以调用uname()来看看具体信息。

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

os.environ
  • python装在哪
  • 系统级存package的地方
  • 本程序根目录

操作文件与目录
查看,创建和删除目录可以这样调用:

#当前目录的绝对路径os.path.abspath('.')#在某个目录下创建一个新的目录,#首先把新目录的完整路径表示出来:os.path.join('/Users/zhangce','haha')#这里你得到的是一个字符串,代表了新的文件夹是这个位置:/Users/zhangce/haha/#自己也可以拼起来但是怕不同操作系统下的区分符的问题,最好使用os接口#但是你并没有创建新的文件#需要用mkdir创建:os.mkdir('/Users/zhangce/haha/')#同理,删除一个文件夹os.rmdir('/Users/zhangce/haha/') 

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

os.path.split('/Users/zhangce/haha.avi')#('/Users/zhangce/','haha.avi')

或者靠os.path.splitext()得到文件扩展名

os.path.splitext('/Users/zhangce/haha.avi')#('/Users/zhangce/haha','.avi')

文件重命名:

os.rename('haha.avi','学习资料')

删除文件

os.remove('学习资料')

尴尬的事复制文件并不存在OS里。原因是赋值这个操作,不是由操作系统提供的。我们可以用上面的代码读入一个文件,再写入一个文件,来达到复制的目的。当然Python作为一个胶水语言,总有第三库来让我们保持stay lazy:shutil就是其中一个。基本上可以看做是OS的补充。它提供copyfile()方法,来复制你的文件:

import shutilshutil.copyfile('/path/to/file','/path/to/other/file')

这个库用起来比OS爽多了。

小例子
通过我们之前提过的方法我们来看看如何完成以下的例子:

  • 列出当前目录下的所有文档
[x for x in os.listdir('.') if os.path.isdir(x)]#你会得到一个list of的文件夹
  • 只想列出.py的文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']#列出所有.py的文件

序列化和反序列化
什么是序列化?
程序运行的过程中,所有的变量都是在内存中操作的,当程序一旦执行完毕,结束退出后,变量占有的内存被操作系统回收了。因此我们需要将某些数据持久化存储到磁盘上,下次运行从磁盘中读取就行。

我们将变量从内存中变成可存储或传输的过程称为序列,在Python中我们称为pickling,在其他语言中叫serialization,marshaling,flatting等等,说的是一个意思。反之,则为反序列化称为unpickling,把变量内容从序列化的对象重新读入到内存中。

序列化

import pickle#此处定义一个dict字典对象d=dict(name='思聪',age=29,score=80)str=pickle.dumps(d)#调用pickle的dumps进行序列化操作,返回strprint(str)#定义一个file对象,设定模式是'wb'f=open('dump.txt','wb')#将内容序列化写入到file文件中,pickle.dump(str,f)f.close()#将文件关闭

反序列化
就是把刚刚弄成的‘序列化’码转成噢Python能看得懂的object

#从之前序列化的dump.txt文件里面读取内容f=open('dump.txt','rb')#设定文件读取模式为'rb'd=pickle.load(f)#调用load做反向序列化处理过程f.close()print(d)print('name is %s'%d['name'])

稍微注意一下,Python2和Python3里面的pickle不一样。为了保证2,3的和谐,你可以用这个方法来保证你import正确:

try:    import cPickle as pickleexcept ImportError:    import pickle

用JSON实现序列化和反序列化
同时你也会发现,这个pickle玩的东西让人看不懂。只有Python自己可以把它unpickle回来。
如果我们有一个文件现在存下来,并且日后可以在其他地方用到的话,我们可以使用JSON来做序列化。Python的数据结构跟JSON有非常完美的兼容:

Json类型 Python类型 {} dict [] list string ‘str’或者u’unicode’ 1234.56 int 或者 float true/false True/False null None
0 0
原创粉丝点击