python学习二

IO编程

stringIO:在内存中读写str. 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可

>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取
>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
...     s = f.readline()
...     if s == '':
...         break
...     print(s.strip())

BytesIO:操作二进制数据。

操作文件和目录:os模块也可以直接调用操作系统提供的接口函数 os.uname() os.environ os.path os.path.splitext() os.rename() os.remove()

序列化:把变量从内存中变成可存储或传输的过程。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling

pickle.dumps()方法把任意对象序列化成一个bytes

进程和线程

在Unix/Linux下,可以使用fork()调用实现多进程。

要实现跨平台的多进程,可以使用multiprocessing模块。

进程间通信是通过Queue、Pipes等实现的

线程是操作系统直接支持的执行单元。Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。

多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了

内置模块

datetime:处理日期和时间的库 collections:是python内奸的一个集合模块,提供了许多有用的集合类。比如:namedtuple:创建自定义的tuple对象,并且规定了tuple元素的格式。

deque:搞笑实现插入和删除操作的双向列表,是和队列和栈。

defaultdict:dict引用值不存在事,可以用defaultdic返回一个默认值

OrderedDict:保持key顺序

Counter:计数器

Base64:常用于图片base64.b64encode(b’binary\x00string’)

struct:解决bytes和其他二进制数据的类型转换

hasglib:加密

hmac:口令加密

contextlib:@contextmanager通过编写generator来简化上下文管理

@closing:closing也是一个经过@contextmanager装饰的generator,它的作用就是把任意对象变为上下文对象,并支持with语句

urllib:操作URL,request模块可以抓取URL内容,常用去爬虫(加beautifulsoup).

urllib提供的功能就是利用程序去执行各种HTTP请求。如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据浏览器的请求头来伪装,User-Agent头就是用来标识浏览器的

HTMLParser:可以把网页中的文本、图像等解析出来

Pillow:操作图像

requests:获取url资源。对于特定类型的响应,例如JSON,可以直接获取

chardet:检测编码

psutil:获取系统信息

还有冠以网络编程的TCP/IP协议,以及UDP,发送邮件的SMTP POP3等,和异步IO的知识就不介绍了,毕竟我也在深入学习中,还需要不断的去码代码,去实践。