python 自学笔记

StringIO

  • 在内存中读写str
  • 先创建一个stringIO,然后像文件一样写入即可
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
  • getvalue()

    • 用于获得写入后的str
  • 要读取stringIO,可以用一个str初始化stringio, 像文件一样读取

>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
...     s = f.readline()
...     if s == '':
...         break
...     print(s.strip())
...
Hello!
Hi!
Goodbye!

bytesIO

  • 操作二进制数据
  • BytesIO实现了在内存中读写bytes, 可以先创建一个BytesIO,然后写入一些bytes
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
  • 写入的并不是bytes,而是经过UTF-8编码的bytes
  • 和stringIO类似,可以使用一个bytes初始化bytesio,然后像文件一样读取
>>> from io import StringIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'

操作文件

  • python 提供的os模块
  • 环境变量

    • os.environ
    • os.environ.get(‘key’) 获取某个环境变量的值
  • 操作文件和目录

    • 操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中
    • 查找、创建、删除目录
# 查看当前目录的绝对路径:
>>> 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.join()` 函数
*  拆分路径时,不要直接拆分字符串,而是要通过`os.path.split()`函数。这个函数把路径拆为两部分,后一部分是最后级别的目录或者文件名
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
 `os.path.splitext()`可以直接得到文件扩展名
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')

进行文件路径合并、拆分的时候并不需要目录和文件真实存在,他们只对字符串操作

  • shutil 模块

  • python 列出当前目录下的所有文件

>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]
  • 列出所有.py文件
>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']

序列化

  • 把变量从内存中变成可存储或传输的过程称为序列化,在python中称为pickling
  • 序列化之后就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上
  • 反过来,把变量内容从序列化的对象重新读到内存里称为反序列化,即unpickling
  • 把一个对象序列化并写入文件:
>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'

pickle.dumps() 方法把任意对象序列化成一个bytes,就可以把这个bytes写入文件。

或者可以用另一个方法pickle.dump直接把对象序列化后写入一个file-like object。

>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
  • 当我们要把对象从磁盘读取到内存时,可以先把内容分读到一个bytes,然后用pickle.loads()的方法反序列化对象,也可以直接用pickle.load方法从一个file-like object中字节反序列化出对象。
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}
  • JSON
    • python内置json模块,可以把一个python对象变成一个json
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'
* dumps() 方法返回一个str, 内容就是一个标准的json, 

你可能感兴趣的:(python)