python学习笔记07-python-IO编程

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值