文件访问与函数式编程入门
- 文本文件读写
- 二进制文件读写
- 文件和目录操作
- 序列化与反序列化
- 高阶函数
- 匿名函数
- 装饰类
- 偏函数
文本文件读写三种方法
第一种方法
直接读入
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.56 | int 或者 float |
true/false | True/False |
null | None |