Python公开课第五节

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

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

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

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 os
os.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 shutil
shutil.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进行序列化操作,返回str
print(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 pickle
except ImportError:
    import pickle

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

Json类型Python类型
{}dict
[]list
string‘str’或者u’unicode’
1234.56int 或者 float
true/falseTrue/False
nullNone
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值