• Python3学习(1)-基础篇
  • Python3学习(2)-中级篇
  • Python3学习(3)-高级篇

 


  • 文件读写
  • 源文件test.txt
line1
line2
line3
  • 读取文件内容
1 f = open('./test.txt','r')#只读模式打开test.txt文件
2 print(f.read())#读取文件的所有内容
3 f.close()#关闭文件
  • 读取文件内容(安全读取try--finally)
1 try:#添加try异常捕获
2     f = open('./test.txt','r')#只读模式打开test.txt文件
3     print(f.read())#读取文件的所有内容
4 finally:
5     if f:    
6         f.close()#关闭文件
  • 使用with简化读取代码
1 with open('./test.txt','r') as f:
2     print(f.read())
3
  • 以上所有的执行结果均为
➜  Python  python3 readTxt.py
line1
line2
line3
  • 读取方法详解
  • read():读取文件的所有内容。针对小文件
  • read(size):按指定大小来读取文件的内容。size字节大小。针对大文件
  • readlines():按行来读取文件的所有内容,返回为list格式。针对配制文件
  • 读取模式
  • 'r':读文件
  • 'rb':二进制读文件
  • 'w':写文件
  • 'wb':二进制写文件
  • StringIO、BytesIO
  • StringIO:字符串IO
  1.  先从io中引入StringIO
  2. 创建一个StringIO对象
  3. 写字符串到StringIO对象f中
  4. 获取字符串内容f.getvalue()
>>> from io import StringIO
>>> f  = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
  • BytesIO
  1.  从io中引入BytesIO
  2. 创建一个BytesIO对象
  3. 写字节对象
  4. 获取写入的字节内容内容
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('我是中文'.encode('utf-8'))
12
>>> print(f.getvalue())
b'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87'
  • 多进程
  • fork()
  • fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
  • 子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。
1 import os
 2 
 3 print('Process (%s) starting...' % os.getpid())
 4 
 5 pid = os.fork()
 6 
 7 if pid == 0 :
 8     print('I am child process (%s) and my parent is %s' %(os.getpid(),os.getppid()))
 9 else:
10     print('I (%s) just created a child process (%s)' %(os.getpid(),pid))
➜  Python  python3 ThreadDemo.py
Process (711) starting...
I (711) just created a child process (712)
I am child process (712) and my parent is 711
  • multiprocessing-Process
1 from multiprocessing import Process
 2 import os
 3 
 4 #子进程代码
 5 def run_proc(name):
 6     print('Run child process %s (%s).'%(name,os.getpid()))
 7 
 8 
 9 if __name__ == '__main__':
10     print('Parent process %s.' % os.getpid())
11     p = Process(target=run_proc,args = ('test',))
12     print('Child process will start..')
13     #启动子进程
14     p.start()
15     #等待子进程结束后再继续往下运行
16     p.join()
17     print('Child process end.')
➜  Python  python3 MultiProcessins.py
Parent process 718.
Child process will start..
Run child process test (719).
Child process end.
  • Pool线程池
1 from multiprocessing import Pool
 2 import os,time,random
 3 
 4 #子进程代码
 5 def long_time_task(name):
 6     print('Run task %s (%s).' %(name,os.getpid()))
 7     start = time.time()
 8     time.sleep(random.random()*3)
 9     end = time.time()
10     print('Task %s runs %.2f seconds.' %(name,(end-start)))
11 
12 
13 if __name__ == '__main__':
14     print('Parent process %s.'%os.getpid())
15     #创建线程池
16     p = Pool(4)
17     for i in range(5):
18         p.apply_async(long_time_task,args=(i,))
19     print('Waiting for all subprocesses done..')
20     p.close()
21     p.join()
22     print('All subprocesses done.')
➜  Python  python3 Pool.py
Parent process 730.
Waiting for all subprocesses done..
Run task 0 (731).
Run task 1 (732).
Run task 2 (733).
Run task 3 (734).
Task 2 runs 0.18 seconds.
Run task 4 (733).
Task 3 runs 0.83 seconds.
Task 0 runs 1.18 seconds.
Task 4 runs 2.46 seconds.
Task 1 runs 2.66 seconds.
All subprocesses done.
  • 子进程
  • 调用外部进程(系统进程):nslookup
  • 使用子进程
1 import subprocess
2 
3 print('$ nslookup www.cnblogs.com')
4 #调用外部
5 r = subprocess.call(['nslookup','www.cnblogs.com'])
6 print('Exit code:',r)
➜  Python  python3 SubProcess.py
$ nslookup www.cnblogs.com
Server:		10.1.1.5
Address:	10.1.1.5#53

Non-authoritative answer:
Name:	www.cnblogs.com
Address: 42.121.252.58

Exit code: 0
  • 直接使用nslookup查看结果
➜  ~  nslookup www.cnblogs.com
Server:		10.1.1.5
Address:	10.1.1.5#53

Non-authoritative answer:
Name:	www.cnblogs.com
Address: 42.121.252.58
  • 多进程数据通信
  • 一个向Queue中写数据,另一外读数据
1 from multiprocessing import Process,Queue
 2 import os,time,random
 3 
 4 #写数据
 5 def write(q):
 6     print('Process to write:%s'%os.getpid())
 7     for value in ['A','B','C']:
 8         print('Put %s to queue.'%value)
 9         q.put(value)
10         time.sleep(random.random())
11 
12 #读数据
13 def read(q):
14     print('Process to read:%s'%os.getpid())
15     while True:
16         value = q.get(True)
17         print('Get %s from queue.'%value)
18 
19 
20 
21 if __name__ == '__main__':
22     q = Queue()
23     pw = Process(target = write,args=(q,))
24     pr = Process(target = read,args=(q,))
25     pw.start()
26     pr.start()
27     pw.join()
28     pr.terminate()
➜  Python  python3 ProcessConn.py
Process to write:803
Put A to queue.
Process to read:804
Get A from queue.
Put B to queue.
Get B from queue.
Put C to queue.
Get C from queue.
  • 选择
  • Unix/Linux下可使用fork()
  • 跨平台使用multiprocessing
  • 多进程数据通信Queue、Pipes
  • 多线程
  • 进程是由若干线程组成的,一个进程至少有一个线程。
1 import time,threading
 2 
 3 #线程代码
 4 def loop():
 5     print('thread %s is running..'%threading.current_thread().name)
 6     n = 0
 7     while n < 5:
 8         n = n + 1
 9         print('thread %s >>> %s' %(threading.current_thread().name,n))
10         time.sleep(1)
11     print('thread %s ended.'%threading.current_thread().name)
12 
13 print('thread %s is running.'%threading.current_thread().name)
14 t = threading.Thread(target = loop,name = 'LoopThread')
15 t.start()
16 t.join()
17 print('thread %s ended.'%threading.current_thread().name)
➜  Python  python3 Thread.py
thread MainThread is running.
thread LoopThread is running..
thread LoopThread >>> 1
thread LoopThread >>> 2
thread LoopThread >>> 3
thread LoopThread >>> 4
thread LoopThread >>> 5
thread LoopThread ended.
thread MainThread ended.