1.文件读写
read()方法可以一次读取文件的全部内容
read(size)方法,每次最多读取size个字节的内容
readline()可以每次读取一行内容
readlines()一次读取所有内容并按行返回list#!/usr/bin/env python # -*- coding: utf-8 -*- try: #读取一个文件 f = open('data.db','r') #读取文件中的全部内容 str1 = f.read() print str1 finally: #如果f对象存在,则关闭文件 if f: f.close() #with方法,不需要手动写finally去关闭文件 with open('data.db','r') as f: print f.read() #以行的形式(readlines)读取文件中的所有行,返回一个list,并且根据索引迭代这个list with open('data.db','r') as f: for index,line in enumerate(f.readlines()): print 'line%d-->%s' % (index,line.strip()) #把未尾的'\n'删掉 #以写的方式打开一个文件 f = open('data.str','w') f.write('Hello,world!') f.close() with open('data.str','r') as f: print f.read() #以二进制的方式,写入文件 with open('data.str','wb') as f: #将unicode字符使用gbk编码后写入文件中 f.write(u'你好!'.encode('gbk')) #以二进制的方式读取文件,并且使用gbk解码 with open('data.str','rb') as f: print f.read().decode('gbk') #引入codecs模块 import codecs #使用codecs打开一个文件,当写入的时候,会自动编码成gbk with codecs.open('data.str','w','gbk') as f: f.write(u'你好吗?') #使用codecs打开一个文件并读取内容,会自动使用gbk解码 with codecs.open('data.str','r','gbk') as f: print f.read()
2.操作文件和目录
复制文件的函数居然在os模块中不存在!原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码
幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充#导入os模块 >> import os #如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统 >> os.name 'posix' #获取详细的系统信息 >> os.uname() ('Linux', 'softm', '2.6.32-431.el6.x86_64', '#1 SMP Fri Nov 22 03:15:09 UTC 2013', 'x86_64') #获取环境变量 >> os.environ {'LESSOPEN': '|/usr/bin/lesspipe.sh %s', 'SSH_CLIENT': '192.168.56.1 51567 22', 'SELINUX_USE_CURRENT_RANGE': '', 'LOGNAME': 'crm', 'USER': 'crm', 'HOME': '/home/crm', 'PATH': '/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin', 'LANG': 'en_US.UTF-8', 'TERM': 'vt100', 'SHELL': '/bin/bash', 'SHLVL': '2', 'G_BROKEN_FILENAMES': '1', 'HISTSIZE': '1000', 'SELINUX_ROLE_REQUESTED': '', '_': '/usr/bin/python', 'SSH_CONNECTION': '192.168.56.1 51567 192.168.56.111 22', 'SSH_TTY': '/dev/pts/0', 'OLDPWD': '/home/crm', 'HOSTNAME': 'softm', 'SELINUX_LEVEL_REQUESTED': '', 'HISTCONTROL': 'ignoredups', 'PWD': '/home/crm/python', 'MAIL': '/var/spool/mail/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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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:'} #获取某个环境变量的值 >> os.getenv('PATH') '/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin' #查看当前目录的绝对路径 >> os.path.abspath('.') '/home/crm/python' #把新目录的完整路径表示出来 >> os.path.join('/home/crm','testdir') '/home/crm/testdir' #创建一个目录 >> os.mkdir('/home/crm/testdir') #删掉一个目录 >> os.rmdir('/home/crm/testdir') #拆分路径,获取文件名 >> os.path.split('/home/crm/testdir/file.txt') ('/home/crm/testdir', 'file.txt') #拆分路径,获得文件扩展名 >> os.path.splitext('/path/file.txt') ('/path/file', '.txt') #对文件重命名 >> os.rename('data.str','test.py') #删掉文件 >> os.remove('test.py') #显示当前目录下的所有文件 >> os.listdir('.') ['hello.py', 'data.db'] #列出当前目录下的所有目录 >> [x for x in os.listdir('.') if os.path.isdir(x)] [] #列出当前目录下的所有文件 >> [x for x in os.listdir('.') if os.path.isfile(x)] ['hello.py', 'data.db'] #列出所有的.py文件 >> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] ['hello.py']
3.序列化
1.pickle
#!/usr/bin/env python # -*- coding: utf-8 -*- try: #优化导入cPickle模块 import cPickle as pickle except ImportError: import pickle d = dict(name='Bob',age=20) #dumps将对象序列化为一个字符串 pickle_str = pickle.dumps(d) print pickle_str print '----------------------' #loads将字符串反序列化为一个对象 d = pickle.loads(pickle_str) print d with open('dump.txt','wb') as f: #dump将序列化后的dict对象写入文件 pickle.dump(d,f) with open('dump.txt','rb') as f: #load从文件中读取序列数据,并反序列化 d = pickle.load(f) print d
2.json
#!/usr/bin/env python # -*- coding: utf-8 -*- import json d = dict(name='Bob',age=20) #dumps将字典序列化为一个json字符串返回 json_str = json.dumps(d) #loads将json字符串反序列化为一个字典对象返回 print json.loads(json_str) with open('json.dump','wb') as f: #dump将字符序列化为一个json字符串,并且写入文件中 json.dump(d,f) with open('json.dump','rb') as f: #load从文件中读取json字符串,并且反序列化为对象 print json.load(f)
3.json进阶
通常class的实例都有一个dict属性,它就是一个dict,用来存储实例变量。也有少数例外,比如定义了slots的class。
#!/usr/bin/env python # -*- coding: utf-8 -*- #导入json模块 import json class Student(object): def __init__(self,name,age): self.name = name self.age = age #定义一个转换方法,用于将Student对象转换为一个字典对象 def student2dict(std): return { 'name':std.name, 'age':std.age } s = Student('Bob',20) #将Student对象序列化为json字符串,同时传入转换方法 print(json.dumps(s,default=student2dict)) #将Student对象序列化为json字符串,同时传入一个通用的转换方法 print(json.dumps(s,default=lambda obj:obj.__dict__)) #定义一个转换方法,用于将字典对象转换为一个Student对象 def dict2student(d): return Student(d['name'],d['age']) json_str = '{"age": 22, "name": "Bob"}' #将json字符串,反序列化为一个Student对象,同时传入一个转换方法 print(json.loads(json_str,object_hook=dict2student))