zoukankan      html  css  js  c++  java
  • os模块学习(转)

    python 文件操作

     

    一、python中文件管理

      文件管理是很多应用程序的基本功能和重要组成部分。Python可以使文件管理极其简单,特别是和其它语言相对比。

    1.介绍

      几乎以任何语言编写的众多应用程序中,文件管理是很重要的一部分。Python当然也不例外。在这篇文章中,我们将探究如何使用一些模块来操作文件。我们会完成读文件,写文件,增加文件内容的操作,写文件,增加文件内容的操作,还有一些另类的用法。

    2.文件读写

      最简单文件操作--读取

    1 FileRead = open("test.txt",'r')
    2 FileRead.read()  #读取文件所有内容,使用print(FileRead.read())函数输出文件内容
    3 FileRead.close()
    复制代码
    1 FileRead = open("test.txt",'r')
    2 for lines in FileRead.readlines():
    3     print("lines:",lines.strip('
    '))
    4 FileRead.close()
    5 
    6 #输出结果
    7 lines: Hello World
    8 lines: Welcome To Beijing
    复制代码
    Python在读取一个文件时,会记住其在文件中的位置。所有在调用FileRead.readline()的时候会从上次读取的位置开始
    1 FileRead = open("test.txt",'r')
    2 print(FileRead.readline().strip('
    ')) #读取第一行数据
    3 print(FileRead.readline().strip('
    ')) #读取第二行数据
    4 FileRead.close()
    使用seek(0)将文件读取的行位置标记到指定的位置
    1 FileRead = open("test.txt",'r')
    2 print(FileRead.readline().strip('
    ')) #读取第一行数据
    3 FileRead.seek(0) #将上次读取的位置调回到首行位置
    4 print(FileRead.readline().strip('
    ')) #读取第一行数据
    5 FileRead.close()
    使用tell()获取python在文件中的当前位置
    1 FileRead = open("test.txt",'r')
    2 print(FileRead.readline().strip('
    ')) #读取第一行数据
    3 print(FileRead.tell()) #获取python所在文件中的当前位置
    4 print(FileRead.readline().strip('
    ')) #读取第二行数据
    5 FileRead.close()

      初级操作--写数据到文件

    1 FileRead = open("test.txt",'w') #‘w’--是指文件将被写入数据,已有的数据将会被清空
    2 FileRead.write('Hello Everybody!
    Welcome To China!') #被写入文件的数据,使用‘
    ’可以实现换行操作
    3 FileRead.close() #关闭文件句柄,每次读写文件都应该在最后面将文件关闭
    1 FileRead = open("test.txt",'a') #‘a’--是指文件将被写入数据,已有的数据不会被清空,在已有数据后面追加下面要添加的数据
    2 FileRead.write('Hello Everybody!
    Welcome To China!') #被写入文件的数据,使用‘
    ’可以实现换行操作
    3 FileRead.close() #关闭文件句柄,每次读写文件都应该在最后面将文件关闭

      文件的高级操作--‘rb’ 'wb'--使用此模式打开文件是读写二进制文件

    二、从现有文件中获取数据

      使用Python中的模块,可以从现有文件中获取信息。使用“os”模块和“stat”模块可以获取文件的基本信息:

    复制代码
     1 #!/usr/local/env python3
     2 '''
     3 Author:@南非波波
     4 Blog:http://www.cnblogs.com/songqingbo/
     5 E-mail:qingbo.song@gmail.com
     6 '''
     7 import os
     8 import stat
     9 import time
    10 FileStats = os.stat('test.txt') #获取文件的基本信息
    11 FileInfo = {
    12     'Size' : FileStats [ stat.ST_SIZE ], #文件大小
    13     'LastModified' : time.ctime(FileStats[ stat.ST_MTIME]),
    14     'LastAccessed' : time.ctime(FileStats[stat.ST_ATIME]),
    15     'CreationTime' : time.ctime(FileStats[stat.ST_CTIME]),
    16     'Mode' : FileStats [ stat.ST_MODE ]
    17 }
    18 print(FileStats) #os.stat_result(st_mode=33206, st_ino=6473924464448069, st_dev=434835, st_nlink=1, st_uid=0, st_gid=0, st_size=70, st_atime=1451980042, st_mtime=1451981189, st_ctime=1451979747)
    19 print(FileInfo) #{'Size': 70, 'Mode': 33206, 'LastAccessed': 'Tue Jan  5 15:47:22 2016', 'LastModified': 'Tue Jan  5 16:06:29 2016', 'CreationTime': 'Tue Jan  5 15:42:27 2016'}
    复制代码

      判断文件是不是目录

    复制代码
     1 #!/usr/local/env python3
     2 '''
     3 Author:@南非波波
     4 Blog:http://www.cnblogs.com/songqingbo/
     5 E-mail:qingbo.song@gmail.com
     6 '''
     7 import os
     8 import stat
     9 import time
    10 def DirIf(FilenName):
    11     FileStats = os.stat(FilenName) #获取文件的基本信息
    12     FileInfo = {
    13         'Size' : FileStats [ stat.ST_SIZE ], #文件大小
    14         'LastModified' : time.ctime(FileStats[ stat.ST_MTIME]),
    15         'LastAccessed' : time.ctime(FileStats[stat.ST_ATIME]),
    16         'CreationTime' : time.ctime(FileStats[stat.ST_CTIME]),
    17         'Mode' : FileStats [ stat.ST_MODE ]
    18     }
    19     if stat.S_ISDIR( FileStats[ stat.ST_MODE ] ): #判断文件是不是目录
    20         return True
    21     else:
    22         return False
    复制代码
    对上面封装的函数进行调用的方法:
    1
    2
    3
    4
    if DirIf('test.txt'== True:
        print("目录")
    elif DirIf('test.txt'== False:
        print('非目录')

      判断文件类型

    复制代码
     1 #!/usr/local/env python3
     2 '''
     3 Author:@南非波波
     4 Blog:http://www.cnblogs.com/songqingbo/
     5 E-mail:qingbo.song@gmail.com
     6 '''
     7 import os
     8 import stat
     9 
    10 FileStats = os.stat('test.txt')
    11 FileMode = FileStats[stat.ST_MODE]
    12 if stat.S_ISREG(FileStats[stat.ST_MODE]): #普通文件判断
    13     print('Regular file.')
    14 elif stat.S_ISDIR(FileStats[stat.ST_MODE]): #目录文件判断
    15     print('Directory.')
    16 elif stat.S_ISLNK(FileStats[stat.ST_MODE]): #快捷方式(链接)文件
    17     print('Shortcut.')
    18 elif stat.S_ISSOCK(FileStats[stat.ST_MODE]): #套接字文件
    19     print('Socket.')
    20 elif stat.S_ISFIFO(FileStats[stat.ST_MODE]): #命名管道文件
    21     print('Named pipe.')
    22 elif stat.S_ISBLK(FileStats[stat.ST_MODE]): #块设备文件
    23     print('Block special device.')
    24 elif stat.S_ISCHR(FileStats[stat.ST_MODE]): #特殊字符型文件
    25     print('Character special device.')
    复制代码
    复制代码
     1 import os.path
     2  
     3 FileStats = 'test.txt'
     4 if os.path.isdir(FileStats):  #判断文件是否是目录
     5     print('Directory.')
     6 elif os.path.isfile(FileStats): #判断文件是否是文件
     7     print('File.')
     8 elif os.path.islink(FileStats): #判断文件是否是快捷方式(链接)文件
     9     print('Shortcut.')
    10 elif os.path.ismount(FileStats): #判断文件是否是挂载文件
    11     print('Mount point.')
    复制代码

      获取文件中的行数

    复制代码
    def Countnum(filename):
        files = open(filename)
        data = files.read()
        files.flush()
        files.close()
        return data.count('
    ')
    复制代码

     

    三、python对目录的操作

      和普通文件一样,关于目录的操作也很容易掌握。首先,列出一个目录的内容:

    1 import os
    2 for fileName in os.listdir ( '/' ):
    3     print(fileName)

      创建目录

    1
    2
    import os
    os.mkdir('testDir')

      创建多级目录

    1
    2
    import os
    os.makedirs('testDir/test2/test3/test4')  #os.makedirs()

      删除多级空目录

    1
    2
    import os
    os.removedirs('testDir/test2/test3/test4')

      删除目录

    1
    2
    import os
    os.rmdir('testDir')

    四、python对特定类型的文件进行操作

      使用fnmatch模块显示'.txt'和'.exe'文件名

    复制代码
    1 import fnmatch
    2 import os
    3 for FileName in os.listdir('/'):
    4     if fnmatch.fnmatch(FileName,'*.txt'):
    5         print(open(FileName).read())
    6     elif fnmatch.fnmatch(FileName,'*.exe'):
    7         print(FileName)
    复制代码

      “fnmatch”模块支持正则表达式:

    复制代码
    import fnmatch
    import os
    import re
     
    FilePattern = fnmatch.translate('*.txt')
    for FileName in os.listdir('./'):
        if re.match(FilePattern,FileName):
            print('Text file.')
    复制代码

      使用glob模块查找一种类型的文件比较方便

    import glob
    for FileName in glob.glob('*.txt'):
        print(FileName)
        print('Text file.')

      使用数字匹配文件名

    import glob
    for FileName in glob.glob ( '[0-9].txt' ):
        print(Filename)

    五、数据编组 

      使用前一节中介绍的模块,可以实现在文件中对字符串的读写。然而,有的时候,你可能需要传递其它类型的数据,如list、tuple、dictionary和其它对象。在Python中,你可以使用Pickling来完成。你可以使用Python标准库中的“pickle”模块完成数据编组。 

      编组一个包含数字和字符的列表:

    复制代码
    #!/usr/local/env python3
    '''
    Author:@南非波波
    Blog:http://www.cnblogs.com/songqingbo/
    E-mail:qingbo.song@gmail.com
    '''
    import pickle
    FileHandle = open( 'PickleFile.txt','wb')
    TestList = ['This',2,'is',1,'a',0,'test.']
    pickle.dump(TestList,FileHandle )
    FileHandle.close()
    复制代码

      拆分编组:

    复制代码
    #!/usr/local/env python3
    '''
    Author:@南非波波
    Blog:http://www.cnblogs.com/songqingbo/
    E-mail:qingbo.song@gmail.com
    '''
    import pickle
    FileHandle = open('PickleFile.txt','rb')  #注意要加'b'进行二进制读写操作,否则报错
    TestList = pickle.load(FileHandle)
    print(TestList)
    FileHandle.close()
    复制代码

      错误

    1
    2
    TypeError: must be strnot bytes错误:
    解答: 写文件处 open(filename, 'w').write 应该写为 open(filename, 'wb').write

      复杂编组:

    复制代码
    import pickle
    
    FileHandle = open('PickleFile.txt','wb')
    TestList = [ 123, { 'Calories' : 190 }, 'swht', [ 1, 2, 7 ] ]
    pickle.dump(TestList,FileHandle)
    FileHandle.close()
    复制代码

      拆组:

    复制代码
    import pickle
    
    FileHandle = open('PickleFile.txt','rb')
    TestList = pickle.load(FileHandle)
    print(TestList)
    FileHandle.close()
    复制代码

    比较:在python2.7版本里还有一个模块,相对于pickle模块而言,处理速度更快。当然在python3已经将其去掉,或者将其性能整合到pickle模块中了。

    复制代码
    #!/usr/local/env python2
    '''
    Author:@南非波波
    Blog:http://www.cnblogs.com/songqingbo/
    E-mail:qingbo.song@gmail.com
    '''
    import cPickle
    
    FileHandle = open('PickleFile.txt','wb')
    TestList = [ 123, { 'Calories' : 190 }, 'swht', [ 1, 2, 7 ] ]
    cPickle.dump(TestList,FileHandle)
    FileHandle.close()
    复制代码

    六、创建虚拟文件

      你用到的许多模块包含需要文件对象作为参数的方法。但是,有时创建并使用一个真实的文件并让人感到有些麻烦。所幸的是,在Python中,你可以使用“StringIO”或者“cStringIO”模块来创建文件并将其保存在内存中,但很不幸的是,这两个模块在python3中都已经被移除。如果你使用的是python2的环境,可以尝试使用一下:

    复制代码
    #!/usr/local/env python2
    '''
    Author:@南非波波
    Blog:http://www.cnblogs.com/songqingbo/
    E-mail:qingbo.song@gmail.com
    '''
    import StringIO
    
    FileHandle = StringIO.StringIO("Let freedom ring") #创建的文件存在内存中
    print(FileHandle.read()) # "Let freedom ring."
    FileHandle.close()
    复制代码
    复制代码
    #!/usr/local/env python2
    '''
    Author:@南非波波
    Blog:http://www.cnblogs.com/songqingbo/
    E-mail:qingbo.song@gmail.com
    '''
    import cStringIO
    
    FileHandle = cStringIO.cStringIO("Let freedom ring") #创建的文件存在内存中
    print(FileHandle.read()) # "Let freedom ring."
    FileHandle.close()
    复制代码

    总结:  

      文件管理,是众多编程语言的程序员在编写应用程序是经常遇到的问题。幸好,和其它语言相比,Python使其出乎意料地容易。Python的标准库中提供了许多相关的模块帮助程序员解决这方面的问题,而它的面向对象的机制也简化了操作。

     

    参考链接:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=402454450&idx=2&sn=2f20a3df2a031beb689fe330b227935c&scene=23&srcid=0103i7fhuH1utpUpJSPeg9pW#rd

    原文链接:http://blog.csdn.net/wwwjfy/article/details/2575942

     

  • 相关阅读:
    leetcode 之Jump Game
    leetcode 之 Symmetric Tree
    leetcode 之 House Robber
    设计模式之建造者模式
    centos7 yum tab 补全
    设计模式之适配器模式
    设计模式之状态模式
    设计模式之外观模式
    设计模式之模板方法模式
    对以<uses-permission android:maxSdkVersion="xx" /> 中的说明
  • 原文地址:https://www.cnblogs.com/uglyliu/p/7155641.html
Copyright © 2011-2022 走看看