您的位置:首页 > 编程语言 > Python开发

python 文件操作(转载)

2013-12-08 00:51 405 查看

一、python 文件操作

1.import glob 目录操作

查看目录内容:filelist=glob.glob(‘*.*’)filelist=glob.glob(‘c:\*’)查看指定类型的文件:filelist=glob.glob(‘c:\*.sys’)为了显示一个目录中的全部文件,可以使用如下所示的os.listdir函数:
files = os.listdir(r’C:\hpl\scripting\src\py\intro’) #适用于 Windows  
files = os.listdir(’/home/hpl/scripting/src/py/intro’) # 适用于Unix
files = os.listdir("d:\python26") files=os.listdir("c:\\") # 跨平台版本:   
files = os.listdir(os.path.join(os.environ[’scripting’],   ’src’, ’py’, ’intro’))   
files = os.listdir(os.curdir) # 当前目录中的所有文件   
files = glob.glob(’*’) + glob.glob(’.*’)

二、测试文件类型

  我们知道,文件名、目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名、目录名还是 链接名呢?这时,我们可以使用os.path模块提供的isfile函数、isdir函数和islink函数来达成我们的目标,如下所示: 

三 文件时间

 
1    time_of_last_access = os.path.getatime(myfile)
2   time_of_last_modification = os.path.getmtime(myfile)
3   size = os.path.getsize(myfile)
4   这里的时间以秒为单位,并且从1970年1月1日开始算起。为了获取以天为单位的最后访问日期,可以使用下列代码:
5   import time # time.time()返回当前时间
6   age_in_days = (time.time()-time_of_last_access)/(60*60*24)

四 文件详细信息

为了获取文件的详细信息,可以使用os.stat函数和stat模块中的其它实用程序来达到目的,如下: 

五、文件和目录的删除

  若要删除单个文件的话,可以使用os.remove函数,例如:os.remove(’mydata.dat’)。Os.remove的别名是 os.unlink,不过后者跟传统的UNIX操作系统以及Perl中清除文件的函数重名。我们可以使用下列方式来删除一组文件,如所有以.jpg以 及*.gif为扩展名的文件:  

六、文件的复制与重命名

七 、分解路径名

  

八、目录的创建和移动

  

九、遍历目录树

  下面的函数调用  os.path.walk(root, myfunc, arg)  将遍历root目录树;然后,对每个目录名dirname分别调用myfunc(arg, dirname, files)即可,这里参数files是dir中的文件名列表(可通过调用os.listdir(dirname)来获得);arg是用户从调用代码中传 递来的参数。对于UNIX操作系统用户来说,Python语言中跨平台的os.path.walk相当于Unix命令find。  在解释os.path.walk的用法的时候,人们常使用写出主目录中所有子目录内的文件的名称为例进行说明。当然,我们也可以在一个交互式的Python命令行中使用下列代码段来体会os.path.walk的使用:  def ls(arg, dirname, files):  print dirname, ’has the files’, files  os.path.walk(os.environ[’HOME’], ls, None)  本例中,参数arg并非必需,所以在os.path.walk调用中让其取值为None即可。  为了列出主目录中所有大于1Mb的文件,可以使用下面的代码:  def checksize1(arg, dirname, files):  for file in files:  filepath = os.path.join(dirname, file)  if os.path.isfile(filepath):  size = os.path.getsize(filepath)  if size > 1000000:  size_in_Mb = size/1000000.0  arg.append((size_in_Mb, filename))  bigfiles = []  root = os.environ[’HOME’]  os.path.walk(root, checksize1, bigfiles)  for size, name in bigfiles:  print name, ’大小为’, size, ’Mb’  现在,我们使用arg来建立一个数据结构,这里是一个2元组构成的列表,其中每个2元组存放文件的尺寸(以MB为单位)和完整的文件路径。如果用于所有目录的函数调用中都要更改arg的话,那么arg必须是一个可变的数据结构,即允许适当地进行修改。  参数dirname是当前正在访问的目录的绝对路径,而参数files内的文件名则是相对于dirname的相对路径。在此期间,当前工作目录并没有 改变,那就是说该脚本仍然呆在脚本启动时刻所在的目录中。这就是为什么我们需要把filepath弄成带有dirname和file的绝对路径的原因。若 要改变当前工作目录为dirname,只要在针对每个目录调用os.path.walk的函数中调用一下os.chdir(dirname),然后在该函 数的末尾重新调用os.chdir(dirname)将当前工作目录改回原值即可,如下所示:  def somefunc(arg, dirname, files):  origdir = os.getcwd(); os.chdir(dirname)    os.chdir(origdir)  os.path.walk(root, somefunc, arg)  当然,如果您愿意也可以编写具有类似功能的代码来替代os.path.walk。下面的代码,将针对每个文件而非每个目录来调用的自定义函数,如下所示:  def find(func, rootdir, arg=None):  # 对rootdir目录中的每个文件调用func  files = os.listdir(rootdir) # 获取rootdir目录中的所有文件  files.sort(lambda a, b: cmp(a.lower(), b.lower()))  for file in files:  fullpath = os.path.join(rootdir, file)  if os.path.islink(fullpath):  pass  elif os.path.isdir(fullpath):  find(func, fullpath, arg)  elif os.path.isfile(fullpath):  func(fullpath, arg)  else:  print ’find: cannot treat ’, fullpath  上面的函数find可以从scitools模块中获取。与内置函数os.path.walk相反,我们的find函数以大小写敏感的字母顺序来访问文件和目录。  我们可以使用find函数来列出所有大于1Mb的文件:  def checksize2(fullpath, bigfiles):  size = os.path.getsize(fullpath)  if size > 1000000:  bigfiles.append(’%.2fMb %s’ % (size/1000000.0, fullpath))  bigfiles = []  root = os.environ[’HOME’]  find(checksize2, root, bigfiles)  for fileinfo in bigfiles:  print fileinfo  参数arg带来了巨大的灵活性。我们可以使用它来同时存放输入数据和生成的数据结构。下一个范例将收集所有大于一定尺寸的带有规定扩展名的文件的文件名和大小。输出的结果按照文件大小排列。  bigfiles = {’filelist’: [], # 文件名和大小列表  ’extensions’: (’.*ps’, ’.tiff’, ’.bmp’),  ’size_limit’: 1000000, # 1 Mb  }  find(checksize3, os.environ[’HOME’], bigfiles)  def checksize3(fullpath, arg):  treat_file = False  ext = os.path.splitext(fullpath)[1]  import fnmatch # Unix的shell风格的通配符匹配  for s in arg[’extensions’]:  if fnmatch.fnmatch(ext, s):  treat_file = True # fullpath带有正确的扩展名  size = os.path.getsize(fullpath)  if treat_file and size > arg[’size_limit’]:  size = ’%.2fMb’ % (size/1000000.0) # 打印  arg[’filelist’].append({’size’: size, ’name’: fullpath})  # 按照大小排列文件  def filesort(a, b):  return cmp(float(a[’size’][:-2]), float(b[’size’][:-2]))  bigfiles[’filelist’].sort(filesort)  bigfiles[’filelist’].reverse()  for fileinfo in bigfiles[’filelist’]:  print fileinfo[’name’], fileinfo[’size’]  注意为列表排序的函数,bigfiles[’filelist’]函数中的每个元素就是一个字典,键size保存着一个字符串,不过在进行比较之前我们必须将单位Mb(最后两个字符)去掉,并将其转换为浮点数。

十、文件读写

首先是建立关联...假设在存在以下文件 e:test.txtThis is line #1This is line #2This is line #3END>>> f = file('e:\test.txt', 'r')关键字的第一部分,是文件路径及名称。注意这里面,路径需要用\第二部分,是对文件的模式或者叫权限,一般有以下3种 "r" (read), "w" (write)和 "a"(append).之后,就可以利用f_content = infile.read()f_content = infile.readlines()来读取文件内容了>>> f = file('e:\test.txt', 'r')>>> f_content = f.read()>>> print f_contentThis is line #1This is line #2This is line #3END>>> f.close()>>>>>> infile = file('e:\test.txt', 'r')>>> f = file('e:\test.txt', 'r')>>> for f_line in f.readlines():print 'Line:', f_lineLine: This is line #1Line: This is line #2Line: This is line #3Line: END>>> f.close()>>>然后是文件的写入1. >>> f=file('e:\test.txt','w')2. >>> f.write('billrice')3. >>> f.write('testtest')4. >>> f.write('entern')5. >>> f.writelines(['billrice','ricerice'])6. >>> f.close()7. >>>8. >>> f=file('e:\test.txt','r')9. >>> content=f.read()10. >>> print content11. billricetesttestenter12. billricericerice13. >>>需要注意的是...在f.close()之前,c盘下面只有一个空空的test.txt,f.close()的作用相当于最后的存盘。删除文件:name='e:1.txt'os.remove(name)压缩文件:import osimport zipfileimport time# 压缩目录source_dir= r'F:web'# 按时间生成文件名称target_file = time.strftime('%Y%m%d%H%M%S') + '.zip'myZipFile = zipfile.ZipFile(target_file, 'w' )# 压缩所有文件,包含子目录for root,dirs,files in os.walk(source_dir):for vfileName in files:fileName = os.path.join(root,vfileName)myZipFile.write( fileName, fileName, zipfile.ZIP_DEFLATED )# 压缩完成myZipFile.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: