• python的I/O编程:文件打开、操作文件和目录、序列化操作


    1 文件读写

    1.1 打开文件:
    open(r'D: ext.txt')

    1.2 文件模式

    功能描述
    ‘r’ 读模式
    ‘w’ 写模式
    ‘a’ 追加模式
    ‘b’ 二进制模式
    ‘+’ 读写模式

    1.3 文件缓冲区

    1.4 文件读取

    • 使用try ...finally来保证程序的健壮性

    • 使用with语句代替try finally和close方法

      with open(r'd: ext.txt','r') as fileReader:
      print fileReader.read()

    • 调用readline()可以每次读取一行内容

      with open(r'd: ext.txt','r') as fileReader:
      for line in fileReader.readline():
      print fileReader.read()

    1.5 文件写入

    2 操作文件和目录

    3 序列化操作

    * 将内存中的变量序列化之后,可以把序列化的内容 写入磁盘,或者通过网络传输到别的机器上,实现程序状态的保存和共享,反之为反序列化
    
    * python 提供两个模块:cPickle和pickle来实现序列化,两个模块功能和函数一样,前者运行效率高,使用c语言,不用pip安装,本身自带
    
    * pickle实现序列化主要使用的是dumps方法或dump方法,dumps方法可以将任意对象序列化成一个str,然后将str写入文件进行保存
    
    
    >>> import cPickle as pickle
    >>> d = dict(url='index.html',title='home',content='home')
    >>> pickle.dumps(d)
    "(dp1
    S'content'
    p2
    S'home'
    p3
    sS'url'
    p4
    S'index.html'
    p5
    sS'title'
    p
    6
    g3
    s."
    >>>
    
    * 如果使用dump方法,可以把序列化对象存在文件中
    
    >>> f =open(r'D:	ext.txt','wb')
    >>> pickle.dump(d,f)
    >>> f.close()
    >>>
    
    * pickle反序列使用loads或load方法,可先从文件取出放在str,在调用load,或者直接从文件load
    
    >>> f =open(r'D:	ext.txt','rb')
    >>> d = pickle.load(f)
    >>> f.close()
    >>> d
    {'content': 'home', 'url': 'index.html', 'title': 'home'}
    >>>
    

    3 进程和线程

    3.1 多线程

    • python可以使用os模块和multiprocessing模块实现多线程,后者可以跨平台,前者只能在Unix/linux操作系统上运行
      

    3.1.1 使用os模块中的fork方式实现多线程

       import os
       print os.getpid() #获取子进程的进程号
       pid = os.fork()
       if pid == 0 :
         print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())
       else :
         print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)
    

    3.1.2 使用multiprocessing模块创建多线程

    from multiprocessing import Process  #导入Process模块 
    import os  
    def test(name):
    	'''
    	函数输出当前进程ID,以及其父进程ID。
    	此代码应在Linux下运行,因为windows下os模块不支持getppid()
    	'''
        print "Process ID: %s" % (os.getpid())  
        print "Parent Process ID: %s" % (os.getppid())  
    if __name__ == "__main__": 
    	'''
    	windows下,创建进程的代码一下要放在main函数里面
    	''' 
        proc = Process(target=test, args=('nmask',))  
        proc.start()  
        proc.join()
    

    3.1.3 multiprocessing提供一个pool类来代表进程池

    #!code:utf-8
    from multiprocessing import Pool
    import os,time,random
    
    def run_task(name):
        print('Task %s is running ....')
        time.sleep(random.random()*3)
        print('Task %s end' %name)
    
    if __name__ == '__main__':
        print 'Current process this,'
        p = Pool(processes=3)
        for i in range(5):    #运行5个任务,但pool只允许3个进程,其余等待
            p.apply_async(run_task,args=(i,))
        print 'Waiting for all subprocesses done'
        p.close()    #close必须在join之前运行,调用close之后就不能再添加新的Process了
        p.join()
        print('All subprocesses')
    
    • 运行结果:
  • 相关阅读:
    Linux0.11内核--fork进程分析
    Linux0.11内核--内存管理之1.初始化
    Linux0.11内核--进程调度分析之2.调度
    Linux0.11内核--进程调度分析之1.初始化
    github
    推荐大家一个靠谱的论文检测平台。重复的部分有详细出处以及具体修改意见,能直接在文章上做修改,全部改完一键下载就搞定了。他们现在正在做毕业季活动, 赠送很多免费字数,可以说是十分划算了!地址是:https://www.paperpass.com/
    妈妈再也不用担心我找idea激活码了
    eclipse集成tomcat
    DNS--localhost
    RFC 2819)第5节"Definitions"除外的全部内容
  • 原文地址:https://www.cnblogs.com/guguobao/p/9395414.html
Copyright © 2020-2023  润新知