python基础知识(5)

本文介绍了Python中的IO操作,包括文件读写、使用StringIO和BytesIO进行内存读写;展示了如何利用os模块进行文件和目录的操作;并深入探讨了序列化与反序列化的方法,特别是JSON序列化的应用。
摘要由CSDN通过智能技术生成

目录

IO编程

文件读写

StringIO和BytesIO 

操作文件和目录 

序列化

 JSON

JSON进阶 


IO编程

  • 文件读写

    •  file-like Object。open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object,除了file外,还可以是内存的字节流,网络流,自定义流等等
    • # 读文件
      with open('/path/to/file', 'r') as f:
          print(f.read())
      
      
      #读取二进制文件
      f = open('/Users/michael/test.jpg', 'rb')
      
      #读取非UTF-8编码的文本文件,比如读取gbk编码的文件
      f = open('/Users/michael/gbk.txt', 'r', encoding='gbk') 
      
      #errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略
      f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
      
      # 写文件,函数传入encoding参数,将字符串自动转换成指定编码,'a'以追加(append)模式
      f = open('/Users/michael/test.txt', 'w')
  • StringIO和BytesIO 

    • 内存中读写数据,open是读写文件中的数据
    • from io import StringIO
      
      f = StringIO()
      f.write('hello') #写 seek=5
      f.getvalue() #读
      
      
      f = StringIO('Hello!\nHi!\nGoodbye!') #写 , seek=0
      s = f.readline()  #读取
      
      
      # BytesIO 实现了在内存中读写bytes
      # 第一种方式写入之后,光标变成5了
      # 第二种方式光标还是0
  • 操作文件和目录 

    •  操作系统基本信息

    • import os
      
      os.name # 操作系统类型,posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统
      os.uname() #操作系统详细信息
      
      
      """
      环境变量
      
      操作系统中定义的环境变量,全部保存在os.environ这个变量
      """
      os.environ
      
      os.environ.get('key')
    • 操作文件和目录
    • """
      操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中
      """
      
      os.path.abspath('.') #查看当前目录的绝对路径
      
      
      # 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来
      #两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,
      #这样可以正确处理不同操作系统的路径分隔符
      os.path.join('/Users/michael', 'testdir')
      
      
      同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数
      os.path.split('/Users/michael/testdir/file.txt')
      #('/Users/michael/testdir', 'file.txt')
      os.path.splitext()  #可以直接让你得到文件扩展名
      
      os.mkdir('/Users/michael/testdir') # 然后创建一个目录
      
      os.rmdir('/Users/michael/testdir') # 删掉一个目录
      
      # 对文件重命名
      os.rename('test.txt', 'test.py')
      
      #os不存在复制文件的函数
      #但是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充
      
      
      #过滤文件
      [x for x in os.listdir('.') if os.path.isdir(x)]
      
      
      
  • 序列化

在程序运行的过程中,所有的变量都是在内存中,可以随时修改变量,一旦程序结束,变量所占用的内存就被操作系统全部回收,如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上

把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling 

  •         
    • Python提供了pickle模块来实现序列化
    • import pickle
      
      d = dict(name='Bob', age=20, score=88)
      
      pickle.dumps(d) #把任意对象序列化成一个bytes,然后就可以把这个bytes写入文件
      
      
      """
      也可以用pickle.dump()直接把对象序列化后写入一个file-like Object
      """
      
      f = open('dump.txt', 'wb')
      d = dict(name='Bob', age=20, score=88)
      pickle.dump(d, f)
      f.close()
      
      
      """
      反序列化load,或者用loads从一个bytes中反序列化
      """
      f = open('dump.txt', 'rb')
      d = pickle.load(f)
      f.close()
      
      
  •  JSON

    • 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输
    • """
      json模块提供了非常完善的Python对象到JSON格式的转换
      """
      
      import json
      
      d = dict(name='Bob', age=20, score=88)
      
      json.dumps(d)  # dumps()方法返回一个str,内容就是标准的JSON
      
      #类似的,dump()方法可以直接把JSON写入一个file-like Object
      
      
      """
      要把JSON反序列化为Python对象
      
      loads(),把JSON的字符串反序列化,
      
      load(), 从file-like Object中读取字符串并反序列化
      """
      
      json_str = '{"age": 20, "score": 88, "name": "Bob"}'
      json.loads(json_str)
  • JSON进阶 

    • dict对象可以直接序列化为JSON,我们更喜欢用class表示对象,比如定义Student类,然后序列化
    • import json
      
      class Student(object):
          def __init__(self, name, age, score):
              self.name = name
              self.age = age
              self.score = score
      
      s = Student('Bob', 20, 88)
      print(json.dumps(s))  # 报错TypeError,因为Student对象不是一个可序列化为JSON的对象
      
      
      # 增加可选参数default,把任意一个对象变成一个可序列为JSON的对象
      
      def student2dict(std):
          return {
              'name': std.name,
              'age': std.age,
              'score': std.score
          }
      
      json.dumps(s, default=student2dict)
      
      # 也可以偷懒用lambda, 其中__dict__,用来存储实例变量
      json.dumps(s, default=lambda obj: obj.__dict__)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值