- 文件读写
(1)读取文件
文件的读写和大部分语言的文件的读写类似,都是有抛出异常,通try来进行异常的检查,检查完成后,来进行读文件,对文件的操作完成后将文件进行关闭
#进行文件的读操作 try : filename="D:\\example.txt" f=open(filename) message=f.read() print(message) finally : f.close()
还有一种更加简单的方式来进行文件的读写操作,是使用with进行的
#进行文件的读操作 filename="D:\\example.txt" with open(filename,'r') as f : #用只读方式打开文档 print(f.read())
(2)二进制文件的读取
我们刚才讲的是对文本文件的读取,用的是utf-8编码,当我们读取像图片,音频等文件的时候要‘rb’打开文件
#进行文件的读操作 filename="D:\\picture.jpg" with open(filename,'rb') as f : # print(f.read())
(3)读取字符
对于读取非utf-8编码的字符,当我们进行读取的时候要传入encoding=" "参数
with open("D:/file.txt","r",encoding="gbk",) as f:
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError
,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()
函数还接收一个errors
参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
with open("D:/math.txt",'r',encoding="utf-8",errors="ignore")
- 文件操作读写练习代码
#文件读写操作练习 #读取文档 def readTextFile(filename) : with open(filename,'r') as f : str=f.read() print(str) #读取二进制文档 def readBinaryFile(filename) : with open(filename,'rb') as f : str=f.read() print(str) #写入文件 def writeInFile(filename,str) : with open(filename,'w') as f : f.write(str) #尾部添加内容 def appendFile(filename,str) : with open(filename,'a') as f : f.write(str) #测试文件 sign=True filename="D:/example.txt" while sign : print("1--读取文档,2--读取二进制文档,3--写入文档,4--尾部添加文档") a=input("your input :") if a=='1' : readTextFile(filename) elif a=='2' : readBinaryFile(filename) elif a=='3' : str=input("输入您要存档的内容:") writeInFile(filename,str) elif a=='4' : str=input("输入您要尾部添加的内容:") appendFile(filename,str) else : sign=False
2.StringIO和BytesIO 使用
很多的时候数据读写不一定在文件上,也可以在内存中读写
StringIO故名思议实在内存中读写str
现创建StringIO再使用
#导入需要的模块 from io import StringIO #StringIO使用方法 f=StringIO() #正常读写 str="hello this is a string io file " f.write(str) f.write("hello this is a new file ") #获得f中的值 print(f.getvalue())
这个使用类似于文件的操作(读写),只不过是存储再内存中的
BytesIO的使用
#导入需要的模块 from io import StringIO from io import BytesIO #StringIO只能操作字符串,如果操作二进制数据仍要使用BytesIO f=BytesIO(('中文').encode('utf8')) #进行编码转换 print(f.getvalue())
果然转化成了二进制编码
3.文件操作和目录
(1)查看环境变量
#导入需要的模块 import os #操作文件和目录 #输出所有名称的环境变量 allpath=os.environ print(allpath) #输出某个特定名称的环境变量 keyname=input("输入环境变量的名称") path=os.environ.get(keyname) print(path)
(2)操作目录和文件
操作文件和目录的函数一部分放在os
模块中,一部分放在os.path
模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:
#导入需要的模块 import os #操作文件和目录 #查看目录,当前路径等功能 #查看当前目录的绝对路径 nowpath=os.path.abspath('.') #其中.表示当前 #在某个目录下创建一个新的目录 #第一步先表示出新创建目录的名称 dictname="newdictname" newpath=os.path.join(nowpath,dictname) print("要创建的目录为%s"% newpath) #创建一个新目录 os.mkdir(newpath) #删除一个目录 os.rmdir(newpath)
(3)合并路径和拆分路径
#合并路径使用到的语句 newpath=os.path.join(os.path.abspath('.'),'dictoryname') #拆分路径---拆分后分为两部分,最后一部分是最后的目录命或文件名 path,filename=os.path.split(newpath) print("路径名为%s,文件名为%s"%(path,filename))
os.path.splitext()
可以直接让你得到文件扩展名,很多时候非常方便:
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。
文件操作使用下面的函数。假定当前目录下有一个test.txt
文件:
# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件: >>> os.remove('test.py')
但是复制文件的函数居然在os
模块中不存在!原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码。
幸运的是shutil
模块提供了copyfile()
的函数,你还可以在shutil
模块中找到很多实用函数,它们可以看做是os
模块的补充。
最后看看如何利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:
#拆分路径---拆分后分为两部分,最后一部分是最后的目录命或文件名 path,filename=os.path.split(newpath) print("路径名为%s,文件名为%s"%(path,filename)) #过滤目录 dict=[x for x in os.listdir('.') if os.path.isdir(x)] for d in dict : print(" %s\n"%d)
要列出所有的.py
文件,也只需一行代码:
>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] ['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']
是不是非常简洁?