设为首页 收藏本站
查看: 941|回复: 0

[经验分享] python之IO操作

[复制链接]

尚未签到

发表于 2015-12-1 12:34:33 | 显示全部楼层 |阅读模式
  文件读写
  在Python中,文件读写是通过open()函数打开的文件对象完成的。使用with语句操作文件IO是个好习惯。



try:
f = open('1.txt', 'r')  #rb写二进制
#f = open('1.txt', 'w')  #wb读二进制
f.read().decode('utf8')
#f.write('test').encode('utf8')
finally:
if f:
f.close()
用with写:
with open('1.txt', 'r') as f:
print f.read()
  如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便
  

  模式

  描述

  r

  以读方式打开文件,可读取文件信息。

  w

  以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容

  a

以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建
  r+

  以读写方式打开文件,可对文件进行读和写操作。

  w+

  消除文件内容,然后以读写方式打开文件。

  a+

  以读写方式打开文件,并把文件指针移到文件尾。

  b

  以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。

  
  read(size) # 读取所有内容至字符串,若设定了size,就最多读取size个字节的内容
readline(size)  # 每次读取一行内容
readlines()  # 读取所有内容并按行返回list
  write()  # 将字符串写入到文件
writelines()  # 接受一个字符串列表作为参数,将它们写入文件
  ps:当使用输入方法如 read() 、readline() 、readlines() 从文件中读取行时, Python 并不会删除行结束符. 这个操作被留给了程序员.
类似地, 输出方法 write() 或 writelines() 也不会自动加入行结束符. 你应该在向文件写入数据前自己完成
  
  文件迭代
  for eachline in f: # 一行行访问文件
  
  操作系统差异
Linux、Mac:换行符(\n) 路径分隔符(/)
windows、dos:换行符(\r\n) 路径分隔符(\)
  os模块中考虑了上面这些:
linesep   系统行分隔符
sep       系统路径分隔符
pathsep   不同路径分隔条
curdir    当前工作目录
pardir    当前工作目录的父目录



>>> print 'aa' + os.linesep + 'bb'
aa
bb
>>> print 'aa' + os.sep + 'bb'
aa\bb
>>> print 'aa' + os.pathsep + 'bb'
aa;bb
>>> print os.curdir
.
>>> print os.pardir
..
  
  
  
  目录操作
  把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符
同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名



得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()
返回指定目录下的所有文件和目录名:os.listdir()
检验给出的路径是否是一个文件:os.path.isfile()
检验给出的路径是否是一个目录:os.path.isdir()
判断是否是绝对路径:os.path.isabs()
检验给出的路径是否真地存:os.path.exists()
返回一个路径的目录名和文件名:os.path.split()      
分离扩展名:os.path.splitext()
获取路径名:os.path.dirname()
获取文件名:os.path.basename()
获取文件属性:os.stat(file)
给出当前平台使用的行终止符:os.linesep    Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'  
创建目录
os.mkdir("file")                  
复制文件
shutil.copyfile("oldfile","newfile")    #oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile")        #oldfile只能是文件夹,newfile可以是文件,也可以是目标目录

复制文件夹

shutil.copytree("olddir","newdir")      #olddir和newdir都只能是目录,且newdir必须不存在

移动文件/
目录
shutil.move("oldpos","newpos")   
重命名文件/目录
os.rename("oldname","newname")      
删除文件
os.remove("file")
删除目录
os.rmdir("dir")    #只能删除空目录
shutil.rmtree("dir")    #空目录、有内容的目录都可以删

转换目录

os.chdir("C:\\123")   #将当前目录设为 "C:\123", 相当于DOC命令的 CD C:\123
  
  file-like Object
  像open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。
  StringIO就是在内存中创建的file-like Object,常用作临时缓冲。
  
  
  
  序列化
  把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
  如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,例如JSON
  JSON和Python内置的数据类型对应如下:

JSON类型Python类型
{}dict
[]list
"string"'str'或u'unicode'
1234.56int或float
true/falseTrue/False
nullNone
  
  
  
  
  
          
       
  对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。
  序列化
dumps()方法返回一个str,内容就是标准的JSON。
dump()方法可以直接把JSON写入一个file-like Object。
  反序列化
loads()把JSON的字符串反序列化
load()从file-like Object中读取字符串并反序列化



>>> import json
>>> d = dict(name='David', age=20, score=100)
>>> d_encode = json.dumps(d)
>>> d_encode
'{"age": 20, "score": 100, "name": "David"}'
>>> with open('D:\\1.txt', 'wb') as f:
d_encode_file = json.dump(d, f)
>>> d_decode = json.loads(d_encode)
>>> d_decode
{u'age': 20, u'score': 100, u'name': u'David'}
>>> with open('D:\\1.txt', 'rb') as f:
d_decode_file = json.load(f)
>>> d_decode_file
{u'age': 20, u'score': 100, u'name': u'David'}
  
  将class的实例对象encode,decode为json



import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
def dict2student(d):
return Student(d['name'], d['age'], d['score'])

s = Student('David', 20, 100)
print(json.dumps(s, default=student2dict))
#可选参数default就是把任意一个对象变成一个可序列为JSON的对象

json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student))
#loads()方法首先转换出一个dict对象,传入的object_hook函数负责把dict转换为Student实例
  
  
  
  2015-05-10

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145865-1-1.html 上篇帖子: python学习:基础概念 下篇帖子: python网络编程基础
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表