python文件与文件系统

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:]+'\t'+name[:-2]+'\n')

    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\n')

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])

你可能感兴趣的:(python文件与文件系统)