欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python学习笔记--基础篇

程序员文章站 2022-04-20 09:10:29
寒假了,终于有时间来扩展一下自己的业余知识。 今年寒假有不少自己想了了解学习的东西,简单来说有几个小目标吧 1. 完成python的爬虫,(网站知网 万方 知乎) 2. 利用...

寒假了,终于有时间来扩展一下自己的业余知识。
今年寒假有不少自己想了了解学习的东西,简单来说有几个小目标吧
1. 完成python的爬虫,(网站知网 万方 知乎)
2. 利用django搭建一个的网页
3. 部署安装go语言,熟悉go语言的基础用法
4. 学习了解ELK,主要是elasticsearch。
5. 完成默克检索的代码重构。

Python 基础语法

IO编程

文件读写

打开文件

python中内置的读写文件的函数,方便文件的IO操作。
打开文件的函数为open,具体语法如下

open(name[.mode [.buffering]])
open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式(mode)和缓冲区(buffering)参数都是可选的,默认模式是读模式,默认缓冲区是无。

文件模式

open中的mode参数,主要有如下几种选项

功能描述
r 读模式
w 写模式
a 追加模式
b 二进制模式(可添加到其他模式中使用)
+ 读/写模式(可添加到其他模式中使用)
文件缓冲区

open中第三个参数可选参数buffering控制文件的缓冲,如果参数为0,那么会直接将数据写到硬盘上,如果参数是1,IO操作就是有缓冲的,数据先写到内存里,只有使用flush函数或者close函数才会将数据更新到硬盘;如果参数大于1,则代表缓冲区的大小,如果是任意负数,使用默认缓冲区大小。

文件读取
f = open(r'your_file_path.txt','r')
print f.read()

#使用with 代替try ...finally 
with open(r'your_file_path.txt','r') as fileReader :
    print fileReader.read()

调用read()一次将文件内容读到内存,但是如果文件过大,会出现内存不足的现象。一般对于大文件,可以反复调用read(size)的方法,一次最多读取size个字节。

文件写入

f = open(r'your_file_path','w')
f.write('Write something')
f.close()

我们可以反复调用write()方法写入文件,最后必须使用close()方法来关闭文件。使用write()方法的时候,操作系统不是立即将数据写入文件中的,而是先写入内存中缓存起来,等到空闲的时候在写入文件中,最后使用close()方法就可以将数据完整的写入到文件中去。
和读文件一样,文件操作中也可能会出现IO异常,所以推荐使用with语句:

with open(r'your_file_path') as fileWriter :
    fileWriter.write('Write Something')

操作文件和目录

主要涉及到python中经常使用的os和shutil模块

序列化操作

程序运行中,所有的变量都在内存中,例如在程序中声明一个dict对象,里面存储着爬取的页面链接、页面的标题、页面的摘要等信息:

d = dict(url = ‘index.html’, title = ‘首页’, content = ‘首页’)

在程序运行的过程中,爬取页面的链接会不断变化,比如把url 改成second.html,但是程序一结束或者意外中断,程序内存中的变量都会被操作系统进行回收。如果没有把修改过的url存储起来,下次运行程序的时候,url被初始化为index.html,又是从首页开始,这是我们最不愿意看到的。所以把内存中的变量变成可以村塾或者可传输的过程,就是序列化。

将内存中的变量序列化之后,可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上,实现程序状态的保存和共享。反过来,把变量内容从序列化的对象重读取到内存,称为反序列化。
在Python中,提供了两个模块: cPickle和pickle来实现序列化,前者是C语言编写的,效率比后者高很多,但是两个模块功能是一样的。一般编写程序的时候,采取的方案是先导入cPlikle模块,如果此模块不存在,在导入pickle模块,示例如下:

try :
    import cPickle as pickle 
except ImportError
    import pickle

pickle 实现序列化主要是使用dumps方法或者dump方法。dumps方法可以将任意对象序列化成为一个str,然后可以将这个str写入文件进行保存。在Python Shell中的实例如下:

import cPickle as pickle
d = dict(url = 'index.html', title = '首页', content = '首页')
pickle.dums(d)
#如果使用dump方法 可以直接写入文件
f = open('your_file_path','wb')
pickle.dump(d,f)
f.close()

pickle实现反序列化使用的loads方法或者load方法。把序列化后的文件从磁盘上读取为一个str,然后使用loads方法将这个str反序列化为对象,或者直接使用load方法将文件反序列化为一个对象。

进程和线程

在爬虫开发中,进程和线程的概念是非常重要的。提高爬虫的效率,打造分布式爬虫,读离不开进程和线程的。

多进程

Python中实现多进程的方式主要有两种,一种方式使用os模块中fork方法,另外一种方法是使用multiprocessing模块。这两种方法的区别在前者仅仅适用于Unix/Linux操作系统,对Windows平台不支持。

1.使用os模块中fork方式实现多进程
python的os模块封装了常见的系统调用,其中就有fork方法。fork方法来自于Unix/Linux操作系统中提供的一个fork系统调用,这个方法非常特殊。普通方法都是调用一次,返回一次,而fork方法是调用一次,返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,于是fork方法分别在父进程和子进程中返回。子进程中永远返回0,父进程中返回的是子进程的Id。下面举一个例子,对Python使用fork方法创建进程进行详细讲解。其中os模块中的getpid方法用于获取当前的进程的ID,getpid方法用于获取父进程的ID。

import os
if __name__ = '__main__' :
    print 'current Process (%s) start ...'%(os.getpid())
pid = os.fork()
if pid < 0 :
    print 'error in fork'
elif pid == 0 :
    # 这边是子进程的返回
    print 'I am child process(%s) and my parent process is (%s)',(os.getpid(),os.getppid())
else :
    # 父进程的返回
    print 'I (%s) created a child process (%s).',(os.getpid(),pid)

2、使用multiprocessing模块创建多进程
multiprocessing模块提供一个Process类来描述一个进程对象。创建子进程时,只需要传入一个可执行函数和函数参数,既可以完成一个Process实例的创建,用start()方法启动进程,用join()方法实现进程间的同步。下面通过一个例子来演示创建多进程的流程,代码如下:

import os
from multiprocessing import Process
#子进程要执行的代码
def run_proc(name) :
    print 'Child process %s (%s) Running...' %(name,os.getpid())
if __name__ == '__main__' :
    print 'Parent process %s.'% os.getpid()
    for i in range(5) :
        p = Process(target = run_proc, args = (str(i),))
        print 'Process will start.'
        p.start()
p.join()
print 'Process end.'