我们知道,当文件不存在时,open()方法的write方式和append方式都会创建一个新文件,但是还有很多场景判断文件,比如爬虫在下载图片的时候,可能需要判断文件是否存在,避免重复下载;比如在新建一个文件的时候,可能需要判断文件是否存在,如果存在就先备份……所以,学会判断文件是否存在,还是很有必要的。学习是一个循序渐进的过程。如果能够建立知识点之间的联系,进行系统的学习,效果会更好。阅读本文后,您将阅读到以下内容:1、判断文件的方法(try语句、os模块、pathlib模块)2、以上方法与我们之前学过的惰性try语句相比的优缺点,而我们需要使用with语句来处理文件的读写,但是with语句并不是万能的,所以我们要注意一些异常情况。比如在使用open()方法时,如果文件不存在,程序会抛出FileNotFoundError异常,如果权限不足,则会抛出PersmissionError异常。withopen("python.log","r")asf:...:f.read()------------------------...(略)FileNotFoundError:[Errno2]Nosuchfileordirectory:'python.log'为了避免这些异常导致程序中断,我们可以使用try...except...语句来捕获异常,然后在except子句中处理异常。不过,在猫猫看来,这种方式并不值得推荐。有两个原因。首先,这种方法非常被动,程序的健康会受到不可预知的异常的影响。其次,当文件不存在时,我们可能需要创建文件。如果把这些逻辑写在except子句中,读起来可性太差了。传统的os模块,顾名思义,Python内置的os模块是用来与OS(操作系统)进行交互的模块。它可以在命令行进行很多操作,比如获取操作系统信息,获取/修改环境变量,执行目录操作(创建,删除,遍历)和各种文件操作等。接下来我们要学习的是几个方法与文件判断密切相关。1、os.path.exists()用于判断文件和文件夹是否存在(注意:因为两者都可以判断,为了有效区分文件和文件夹,最好保证文件名有后缀):importos#文件存在VS不存在os.path.exists("test.txt")>>>Trueos.path.exists("cat.txt")>>>False#文件夹存在VS不存在os.path.exists("cat/images")>>>Trueos.path.exists("cat/image")>>>False2,os.path.isfile(),os.path.isdir()判断给定路径是否存在是文件还是文件夹:os.path.isfile("cat/images")>>>Falseos.path.isdir("cat/images")>>>Trueos.path.isfile("test.txt")>>>True3,操作系统。access()检测文件路径的访问权限,语法:os.access(path,mode);其中path是指文件或文件夹,mode是指要检测的模式:os.access("cat/images",os.F_OK)>>>True#path存在os.access("cat/images",os.R_OK)>>>True#路径可读os.access("cat/images",os.W_OK)>>>True#路径可写os.access("cat/images",os.X_OK)>>>True#路径可以执行4.os模块中其他常用方法:os.mkdir()创建目录,os.rmdir()删除目录,os.rename()重命名,os.remove()删除文件,os.path.join()连接目录和文件名,os.path.split()分割目录和文件名……(我就不一一举例了,我会介绍稍后)时兴的pathlib模块pathlib模块是python3.4新增的模块。官方的介绍是面向对象的文件系统路径(Object-orientedfilesystempaths)。这是一个非常强大的模块。文末附上官方文档地址。这里有一些基本的。用法:importpathlibfile_obj=pathlib.Path("test.txt")file_obj.name>>>'test.txt'#文件名file_obj.exists()>>>True#存在file_obj.is_dir()>>>False#文件夹是否file_obj.is_file()>>>True#文件是否好坏几种方法比较围绕文件操作的知识很多,限于篇幅,本文主要介绍判断文件,可能还有讨论未来研究中的其他特定主题。既然知道了几种判断文件是否存在的方法,毛毛就试着根据自己的理解来判断。首先try语句的缺点是不主动判断,不方便根据文件是否存在做针对性的处理。将必要的逻辑交给异常捕获,在某种程度上显得“不负责任”;try语句也有优点,一个是不需要引入模块,也不需要区分各种使用方式。二是将其他可能出现的异常进行封装,避免多系统或多场景的遗漏。os模块是传统的老模块,使用和维护都比较顺畅;它的主要缺点是有些方法比较繁琐,比如用字符串表示文件路径,会造成路径拼接的麻烦。此外,不同操作系统之间路径分隔符的差异(Windows使用\分隔符,Linux和Mac使用/分隔符),也会导致难以发现的错误。相对而言,pathlib功能最强大,但普及度较低,有一定的学习门槛;它的主要优点是面向对象,同时由于封装了不同操作系统的特性,可以有效避免字符串表示文件。路径之谜。它也有缺点,就是没有像os.access()这样可以检测访问权限的方法,虽然这个方法基本不用。下面比较三种拼接文件路径的方法。方法1不对分隔符进行处理,所以不能保证在每个操作系统中都能找到;方法2需要反复使用os.path.join;方法三只用“/”就可以拼接路径,当然也支持多操作系统。#错误拼接:未处理的分隔符data_folder="source_data/text_files/"file_to_open=data_folder+"test.txt"#os模块拼接importosdata_folder=os.path.join("source_data","text_files")file_to_open=os.path.join(data_folder,"test.txt")#pathlib模块拼接frompathlibimportPathdata_folder=Path("source_data/text_files/")file_to_open=data_folder/"test.txt"总结一下,如果文件路径简单,仅仅使用exists()、is_dir()、is_file()这三个方法,os.path模块和pathlib.Path模块同样有用,但是如果考虑到复杂的路径拼接,pathlib.Path会胜出。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
