python IO编程知识点

学习资料来自廖雪峰python

文件读写

  1. 使用open()函数得到文件对象,调用read()方法读取,最后完成后务必调用close()方法关闭文件,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
  2. 参数’r’读取文本文件,'rb’读取二进制文件。
  3. read()一次读取文件全部的内容,read(size)每次最多读取size个字节的内容,readline()可以每次读取一行内容,readlines()一次读取所有内容并按行返回list。
  4. 只要写个read()方法就叫做file-like object。
  5. 读取文件时open()传入encoding参数用于读取特定编码的文件,比如encoding='gbk’读取gbk编码的文件, encoding='utf-8’读取utf-8编码的文件。
  6. 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略,errors=‘ignore’
  7. 写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
  8. 使用with

StringIO和BytesIO

StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。

StringIO

数据读写不一定是文件,也可以在内存中读写。

StringIO顾名思义就是在内存中读写str

要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可,getvalue()方法用于获得写入后的str:

from io import StringIO
f = StringIO()
f.write('hello')
print(f.getvalue())  # hello

也可以用一个str初始化StringIO

f = StringIO('Hello!\nHi!\nGoodbye!')

BytesIO

同理,在内存中读写bytes

 from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())
# b'\xe4\xb8\xad\xe6\x96\x87'

目录文件操作

  1. os.name查看操作系统类型。
  2. os.environ为环境变量,调用os.environ.get(‘key’)可以获取对应的环境变量。
  3. 把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。
  4. 同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名
  5. os.path.splitext()可以直接让你得到文件扩展名
  6. shutil模块提供了copyfile()的函数
  7. 常用方法
# 查看当前目录的绝对路径:
os.path.abspath('.')
# '/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
os.path.join('/Users/michael', 'testdir')
# '/Users/michael/testdir'
# 然后创建一个目录:
os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
os.rmdir('/Users/michael/testdir')
os.path.split('/Users/michael/testdir/file.txt')
# ('/Users/michael/testdir', 'file.txt')
os.path.splitext('/path/to/file.txt')
# ('/path/to/file', '.txt')
# 对文件重命名:
os.rename('test.txt', 'test.py')
# 删掉文件:
os.remove('test.py')

序列化

  1. 把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling。
  2. 把变量内容从序列化的对象重新读到内存里称之为反序列化
  3. Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据。
  4. dumps(obj)序列化成str,dump(obj, f)序列化成file-like object,loads(str)和load(f)反序列化方法与之对应。
  5. 将类对象json化可以使用default参数将类对象字典化在json序列化json.dumps(s, default=lambda obj: obj.__dict__)
  6. 反之如果把序列化的对象反序列化回类对象,定义一个object_hook函数即可
class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

def dict2student(d):
    return Student(d['name'], d['age'], d['score'])
    
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student))
# <__main__.Student object at 0x10cd3c190>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值