python中文件操作技巧

下面一段引自:http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=73&tid=3763

我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。 
   
  .readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用: 
   
  Python .readlines() 示例 
   
      fh = open('c:autoexec.bat') 
  for line in fh.readlines(): 
   print line 
   
  .readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline() 



转自:http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=73&tid=4247

Python中文件操作可以通过open函数,这的确很像C语言中的fopen。通过open函数获取一个 file object,然后调用read(),write()等方法对文件进行读写操作。 1.open 使用open打开文件后一定要记得调

Python中文件操作可以通过open函数,这的确 很像C语言中的fopen。通过open函数获取一个file object,然后调用read(),write()等方法对文件进行读写操作。

1.open

使用open打开文件后一定要记得调用文件对象的 close()方法。比如可以用try/finally语句来确保最后能关闭文件。

file_object = open('thefile.txt')
try:
    all_the_text 
= file_object.read( )
finally:
    file_object.close( )


注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。

2.读文件

读文本文件
input = open('data''r')
#第二个参数默认为r
input = open('data')

 

读二进制文件
input = open('data''rb')

 

读取所有内容
file_object = open('thefile.txt')
try:
    all_the_text 
= file_object.read( )
finally:
    file_object.close( )

 

读固定字节
file_object = open('abinfile''rb')
try:
    
while True:
        chunk 
= file_object.read(100)
        
if not chunk:
            
break
        do_something_with(chunk)
finally:
    file_object.close( )

 

读每行
list_of_all_the_lines = file_object.readlines( )


如果文件是文本文件,还可以直接遍历文件对象获取每行:

for line in file_object:
    process line

 

3.写文件

写文本文件
output = open('data''w')

 

写二进制文件
output = open('data''wb')

 

追加写文件
output = open('data''w+')

 

写数据
file_object = open('thefile.txt''w')
file_object.write(all_the_text)
file_object.close( )

 

写入多行
file_object.writelines(list_of_text_strings)


注意,调用writelines写入多行在性能上会比使用write一次性写入要高。


今天在看Python文件读写操作,发现python这东西真不错。
#打开文件和进行写操作
f=open(‘test.txt’,'w’)
f.write(‘hello’)
f.writelines(['hi','haha'])#多行输入
f.close()
#append data
f=open(‘test.txt’,'a’)
f.write(‘hello’)
f.writelines(['hi','haha'])
f.close()
#连续写入后会自动关闭
open(‘test.txt’,'a’).write(‘11111\r\n’)
#把result里的元素依次填到open函数里去
result={‘hello’,'u’}
exec open(‘test.txt’) in result
#
selected = []                  # temp list to hold matches
fp = open(‘test.txt’)
for line in fp.readlines():    # Py2.2 -> “for line in fp:”
     selected.append(line)
del line                       # Cleanup transient variable
#
open(‘test.txt’).readlines()
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:

     * file(name[, mode[, buffering]])

file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
mode 是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清 空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如 在 unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ ‘\n’ ‘\r\n’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式 字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。

file对象有自己的属性和方法。先来看看file的属性。

     * closed #标记文件是否已经关闭,由close()改写
     * encoding #文件编码
     * mode #打开模式
     * name #文件名
     * newlines #文件中用到的换行模式,是一个tuple
     * softspace #boolean型,一般为0,据说用于print

file的读写方法:

     * F.read([size]) #size为读取的长度,以byte为单位
     * F.readline([size])
       #读一行,如果定义了size,有可能返回的只是一行的一部分
     * F.readlines([size])
       #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
     * F.write(str)
       #把str写到文件中,write()并不会在str后加上一个换行符
     * F.writelines(seq)
       #把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。

file的其他方法:

     * F.close()
       #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
     * F.flush()
       #把缓冲区的内容写入硬盘
     * F.fileno()
       #返回一个长整型的”文件标签“
     * F.isatty()
       #文件是否是一个终端设备文件(unix系统中的)
     * F.tell()
       #返回文件操作标记的当前位置,以文件的开头为原点
     * F.next()
       #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
     * F.seek(offset[,whence])
       # 将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了, whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进 行写操作时,文件操作标记会自动返回到文件末尾。
     * F.truncate([size])


转自:http://www.cnitblog.com/yunshichen/archive/2008/08/11/47900.html

读写文件 

#  ! /usr/bin/python 
#
   -*- coding: utf8 -*-  

spath =  "  D:/download/baa.txt  " 
f = open(spath,  "  w  " )   #   Opens file for writing.Creates this file doesn't exist. 
f.write(  "  First line 1.\n  " )
f.writelines(  "  First line 2.  " )

f.close()

f = open(spath,  "  r  " )   #   Opens file for reading 

for  line   in  f:
      print (  "  每一行的数据是:%s  " % line)

f.close()

''' 
    知识点: 如何读写文件
'''




遍历文件夹和文件



import  os
import  os.path
#   os,os.path里包含大多数文件访问的函数,所以要先引入它们. 
#
   请按照你的实际情况修改这个路径 
rootdir  =    "  d:/download  " 
for  parent, dirnames, filenames   in  os.walk(rootdir):
      #  case 1: 
      for  dirname   in  dirnames:
          print  (  "  parent is:  "   +  parent)
          print  (  "  dirname is:  "   +  dirname)
      #  case 2 
      for  filename   in  filenames:
          print  (  "  parent is:  "   +  parent)
          print  (  "  filename with full path :  "   +  os.path.join(parent, filename))

'''  知识点:

    * os.walk返回一个三元组.其中dirnames是所有文件夹名字(不包含路径),filenames是所有文件的名字(不包含路径).parent表示父目录.
    * case1 演示了如何遍历所有目录.
    * case2 演示了如何遍历所有文件.
    * os.path.join(dirname,filename) : 将形如"/a/b/c"和"d.java"变成/a/b/c/d.java".
''' 


分割路径和文件名

import  os.path
#  常用函数有三种:分隔路径,找出文件名.找出盘符(windows系统),找出文件的扩展名. 
#
  根据你机器的实际情况修改下面参数. 
spath =  "  D:/download/repository.7z  " 

#   case 1: 
p,f = os.path.split(spath);
print (  "  dir is:  " + p)
print (  "  file is:  " + f)

#   case 2: 
drv,left = os.path.splitdrive(spath);
print (  "  driver is:  " + drv)
print (  "  left is:  " + left)
#   case 3: 
f,ext = os.path.splitext(spath);
print (  "  f is:  " + f)
print (  "  ext is:  " + ext)
''' 
    知识点:    这三个函数都返回二元组.
    * case1 分隔目录和文件名
    * case2 分隔盘符和文件名
    * case3 分隔文件和扩展名
''' 


总结:5个函数  
  • os.walk(spath)
  • os.path.split(spath)
  • os.path.splitdrive(spath)
  • os.path.splitext(spath)
  • os.path.join(path1,path2)


复制文件


import  shutil
import  os
import  os.path

src =  "  d:\\download\\test\\myfile1.txt  " 
dst =  "  d:\\download\\test\\myfile2.txt  " 
dst2 =  "  d:/download/test/测试文件夹.txt  " 

dir1 = os.path.dirname(src)

print (  "  dir1 %s  " % dir1)

if (os.path.exists(src) == False):
    os.makedirs(dir1)       

f1 = open(src,  "  w  " )
f1.write(  "  line a\n  " )
f1.write(  "  line b\n  " )
f1.close()


shutil.copyfile(src, dst)
shutil.copyfile(src, dst2)
f2 = open(dst,  "  r  " )
for  line   in  f2:
      print (line)

f2.close()

#  测试复制文件夹树 
try :
    srcDir =  "  d:/download/test  " 
    dstDir =  "  d:/download/test2  " 
      #  如果dstDir已经存在,那么shutil.copytree方法会报错! 
      #  这也意味着你不能直接用d:作为目标路径. 
    shutil.copytree(srcDir, dstDir)
except  Exception as err:
      print  (err)
    
''' 
    知识点:
    * shutil.copyfile:如何复制文件
    * os.path.exists:如何判断文件夹是否存在
    * shutil.copytree:如何复制目录树    
'''

总结:4个函数  
  • os.path.dirname(path)
  • os.path.exists(path)
  • shutil.copyfile(src, dst)
  • shutil.copytree(srcDir, dstDir)


实战:文件备份小程序 


import  os
import  shutil
import  datetime

''' 
作用:将目录备份到其他路径。
实际效果:
假设给定目录"/media/data/programmer/project/python" ,
备份路径"/home/diegoyun/backup/“ ,
则会将python目录备份到备份路径下,形如:
/home/diegoyun/backup/yyyymmddHHMMSS/python/xxx/yyy/zzz..

用法:更改这两个参数.
backdir:备份目的地.
copydirs:想要备份的文件夹.
''' 


def  mainLogic():
      #  add dirs you want to copy 
    backdir =  "  d:\\test  " 
      print (backdir)

    copydirs = []
    copydirs.append(  "  d:\\temp  " );
      #  copydirs.append("d:\\test"); 
    
    

      print (  "  Copying files  ===================  " )
    start = datetime.datetime.now()

      #  gen a data folder for backup 
    backdir = os.path.join(backdir,start.strftime(  "  %Y-%m-%d  " ))
      #  print("backdir is:"+backdir) 

    
    kc = 0
      for  d   in  copydirs:
        kc = kc + copyFiles(d,backdir)

    end = datetime.datetime.now()
      print (  "  Finished! ===================  " )
      print (  "  Total files :   "   +  str(kc) )
      print (  "  Elapsed time :   "   +  str((end - start).seconds) +  "   seconds  " )

def  copyFiles(copydir,backdir):
    prefix = getPathPrefix(copydir)
      #  print("prefix is:"+prefix )    

    i = 0
      for  dirpath,dirnames,filenames   in  os.walk(copydir):
          for  name   in  filenames:
            oldpath = os.path.join(dirpath,name)
            newpath = omitPrefix(dirpath,prefix)
              print (  "  backdir is:  " + backdir )           
            newpath = os.path.join(backdir,newpath)
              print (  "  newpath is:  " + newpath)

              if  os.path.exists(newpath) != True:
                os.makedirs(newpath)  
            newpath = os.path.join(newpath,name)
              print (  "  From:  " + oldpath +  "   to:  " + newpath)
            shutil.copyfile(oldpath,newpath)
            i = i + 1 
      return  i    

def  getPathPrefix(fullpath):
      #  Giving /media/data/programmer/project/ , get the prefix 
      #  /media/data/programmer/ 
    l = fullpath.split(os.path.sep)
      #  print(str(l[-1]=="")     
      if  l[ - 1 ] ==  "" :
        tmp = l[ - 2 ]
      else :
        tmp = l[ - 1 ]
      return  fullpath[0:len(fullpath) - len(tmp) - 1 ]

def  omitPrefix(fullpath,prefix):
      #  Giving /media/data/programmer/project/python/tutotial/file/test.py , 
      #  and prefix is Giving /media/data/programmer/project/, 
      #  return path as python/tutotial/file/test.py 
      return  fullpath[len(prefix) + 1 :]

mainLogic()


资源参考:

你可以在这里看到更多的api解释,感谢该作者:  http://www.cnpython.org/docs/200/p_119.html





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值