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
- 先从io中引入StringIO
- 创建一个StringIO对象
- 写字符串到StringIO对象f中
- 获取字符串内容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
- 从io中引入BytesIO
- 创建一个BytesIO对象
- 写字节对象
- 获取写入的字节内容内容
-
>>> 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'
- StringIO:字符串IO
- 多进程
- 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
- fork()
- 多线程
- 进程是由若干线程组成的,一个进程至少有一个线程。
-
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.
-
- 进程是由若干线程组成的,一个进程至少有一个线程。
posted on 2015-08-04 16:22 One|Piece 阅读(11420) 评论(0) 编辑 收藏 举报