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