文件与文件系统

第11章  文件与文件系统
open()函数:
形式:
open(file,mode='r',buffering=-1,encoding=None,errors=None,....)
返回一个文件对象file

mode取值:
r        只读
w        可写,会清除文件内容
a        附加数据
b        二进制数据模式
x        新建一个文件,可写
+        打开文件直接更新
t        文本模式(默认)

‘rb’ 只读模式打开二进制文件
‘wt’ 可选模式打开文本文件
bufsize 为0时表示打开文件不用缓冲,为1时表示进行缓冲,负值则使用系统默认值,任何其他值则表示使用缓冲的字节数

常用文件操作:
file.read([n])    将整个文件读入字符串中,或指定n字节
file.readline([n])    读入文件的一行到字符串中
file.readlines()       将整个文件按行读入到列表中
file.write(s)          向文件中写入字符串
file.writelines(lines)   向文件中写入一行数据列表
file.close()       关闭打开的文件


Python处理文件中的数据,可以使用while语句来循环读取文件中的行:
while True:
    line=f.readline()
    if not line:
        break
也可以用for语句来迭代文件中的所有行:
for line in f:
    pass

例:
def file_hdl(name='python.txt'):
   f=open(name)
   res=0
   i=0
   for line in f:
       i+=1
       print('第%s行的数据为:'%line.strip(),line)
       res+=int(line)
    print('这些数的和为',res)
    f.close()
if __name__=='__main__':
    file.hdl()

也可以使用with来管理文件的打开和关闭
改写上面的例子:
def file_hdl(name='python.txt'):
    with open(name) as f:
        res=0
        i=0
        for line in f:
            i+=1
            print('第%s行的数据为:'%line.strip(),line)
            res+=int(line)
        print('这些数的和为',res)
 if __name__=='__main__':
    file.hdl()


fileinput操作文件
fileinput模块提供了一个以行模式循环处理一个或多个文件内容,它实现了对文件中行的懒惰迭代,读取时不需要把文件内容放入内存,提高程序效率
fileinput模块常用函数:
input(): 返回能够用于迭代一个或多个文件中所有行的对象
filename(): 返回当前文件的名称
lineno():返回当前读取行的数量
isfirstline():返回当前行是否文件的第一行
filelineno():返回当前读取行在文件中的行数

例:
import fileinput
def demo_fileinput():
    lines=fileinput.input(['fpa.txt','fpb.txt'])
    for line in lines:
        print("总第%d行,"%fileinput.lineno(),
              "文件中%s中第%d行:"%(fileinput.filename,fileinput.filelineno))
        print(line.strip())
if __name__=='__main__':
    demo_fileinput()     



常用文件和目录操作
import os

os.getcwd()    #获得当前路径(所运行程序的目录)
os.listdir(path)   #以列表的形式返回path目录下的文件或目录的名称
os.mkdir(path)   #创建目录
os.rmdir(path)   #删除目录,删除的目录必须为空目录
os.path.isdir(path)   #判断是否是目录
os.path.isfile(path)    #判断是否是文件
os.walk(path)  #返回一个可迭代的生成器
for i in os.walk('test'):
   print(i)   #输出的格式为多个元组,每个元组的第一项为遍历的目录名(字符串),第二项为遍历目录中的子目录列表,第三项为遍历目录中所有文件的列表
for a,b,c in os.walk('test'):
   print(c)   #c 也是可迭代的生成器

由文件名批量获取姓名和考号
import os
filenames=[]
for a,b,files in os.walk('test'):
    if files:
        filenames.append(file[:-4] for file in files)
fname='testexam'
i=o
for files in filenames:
    f=open(fname+str(i)+'.xls','w')
    for name in files:
        f.write(name[-2:]+' '+name[:-2]+' ')
    f.close()
    i+=1
print("成功生成!")

批量文件重命名
import os
perfix='Python'
length=2
base=1
format='mdb'

def PadLeft(str,num,padstr):
    stringlength=len(str)
    n=num-stringlength
    if n>=0:
        str=padstr*n+str
    return str
print('the file in test2 will be renamed')
all_files=os.listdir('test2')
print([f for f in all_files if os.path.isfile(test2/%s)%f])
input=input('press y to continue ')
if input.lower()!='y':
    exit()
filenames=os.listdir('test2')
i=base-1
for filename in filenames:
    i=i+1
    if os.path.isfile('test2/%s'%filename):
        name=str(i)
        name=PadLeft(name,length,'0')
        t=filename.split('.')
        m=len(t)
        if format=='':
            os.rename('test2/%s'%filename,'test2/%s'%(perfix+name+'.'+t[m-1]))
        else:
            if t[m-1]==format:
                 os.rename('test2/%s'%filename,'test2/%s'%(perfix+name+'.'+t[m-1]))
            else:
                 i=i-1
     else:
         i=i-1
all_files=os.listdir('test2')
print([f for f in all_files if os.path.isfile(test2/%s)%f])

原文地址:https://www.cnblogs.com/MUMO/p/5780809.html