本章介绍python中用来读写文件以及访问目录内容的函数和类型。python提供了丰富的输入输出函数,本章将介绍其中使用广泛的那些函数,首先介绍文件对象,它是python中实现输入输出的基本方法,之后将介绍用于操作路径,获取文件信息和访问目录内容的函数。
3.1文件对象
在windows路径名称中,必须在路径中队反斜杠转义,即每次用两个反斜杠,例如,路径C:\windows\temp,用python字符串C:\\windows\\temp,或者放置一个r取消字符串中队反斜杠的特殊处理,r"C:\windows\temp".
3.1.1编写文本文件
下面从创建简单的文本文件开始,创建一个file对象告诉p希望向文件中写数据,file对象代表对一个文件的链接,而不是问价那本身,但是如果试图打开或者像一个不存在的文件写数据,python将自动创建该文件。
>>>def make_text_file(): a= open('text.txt',"w") a.write("this is how you create a new text file") a.close()
可以从创建一个make-text-file()函数开始,告诉python开打一个名为test.txt的文件。由于python找不到该文件,就会自己创建,注意:如果该文件存在,python会删除它并创建一个新文件,后面将需欸写如何在创建一个文件之前检查它是否已经存在。
下面我们创建一个程序,首先检查某个文件是否已经存在,如果存在返回一个错误消息。
>>>import os >>>def make_another_file(): if os.path.isfile('test.txt'): print("you are trying to create a file that already exists!") else: f= open("test.txt","w") f.write("this is how you create a new text file") ... >>>make_another_file() "you are trying to create a file that already exists!"
打开文件时,利用本章讨论的其他文件处理函数,可以制定一个相对路径或者一个绝对路径。
3.1.2向文本里追加文本
向文件中追加文本很容易实现,追加文本不是用参数“w”来实现的了,而是有追加参数“a”。这样可以保证文件中已有的数据不被重写,而是将新文本追加到文件末尾,尝试下面的代码:
>>>def add_some_text(): a = open ('test.txt',"a") a.write("here is some additional text!") ... >>>add_some_text()
在此注意的是,write函数是不会自动换行的,所以我要使用转义序列\n。
3.1.3度文本文件
读文件是类似的,首先,通过创建一个file对象打开文件,这一次,使用“r”告诉python打算读文件,“r”是默认参数,可以省略。
a = open("text.txt","r")
可以使用readline方法从文件中读出一行文本
>>>a.readline() "blablablabla..."
还可以使用read方法一次性读取文件中剩余内容,该方法返回文件中未读取的所有内容。
>>>f= open("test.txt","r") >>>text=a.read() >>>peint(text) this is how much i love you forever never change nothing better than you
都去完后,删除文件对象并关闭
>>>del a >>>a.close()
3.2路径和目录
3.3os异常
os模块中函数在失败时会抛出OSError异常,如果希望程序出错时行为友好,那么必须处理这个异常,与IOError一样,异常的字符串表示描述了遇到的问题。
3.3.1路径
os包含另外一个模块os.path,它提供了操作路径的函数。
3.3.2目录内容
如何才能找到硬盘上实际存在哪些内容,os.listdir模块会返回一个目录下所有名称条目,包括文件和子目录等内容。
获取目录内容
>>>os.listdir("C:\\python31") [blablablabla]
列出桌面或者主目录的内容
使用print_dir_by_ext可以列出桌面或者主目录的内容。windows的桌面是一个文件夹,它的电影路径是c:\\Documents and Settings\\username\\Desktop,其中username为帐户名。
3.3.3获取文件信息
可以很容易地判断一个文件是指向文件还是指向一个目录,如果是指向文件,os.path.isfile将返回true,如果是指向目录,os.path.isdir将返回true。
其他类型的目录条目
在某些平台下,一个目录也许包含许多其他类型的条目,例如符号链接,套接字还有设备等,这些类型的条目的具体含义取决于特定的平台。
递归目录列表
可以将os.path.isdir and os.listdir两者结合起来,例如:递归地处理子目录,可以列出一个目录的内容,它的子目录,子目录的子目录,以此类推,对于这个目的,编写一个递归函数很有用。
注意上面的函数与之前编写的print_dir函数很类似。然而,这个函数为每个条目构造了完整路径full_path,因为这即符合了打印需求,也考虑到子目录的需求
3.3.4重命名,移动,复制和删除文件
模块shutil中包含了操作文件的函数。可以用shutil.move重命名一个文件:
或者,可以使用它将一个文件移动到另外一个目录下:
shutil模块还提供了copy函数,它见一个文件复制为具有一个新名称的文件,或者复制一个新目录下,可以简单地使用如下代码:
删除则是:
如果你是要给老派的UNIX黑客,可以用os.unlink,来完成。
文件权限
文件权限在不同平台上的工作方式是不同的,然而如果需要改变一个文件或者目录的权限,可以使用os.chmod函数,它与unix或者linux系统调用chmod的工作方式相同。
3.3.5轮换文件
3.3.6创建和删除目录
创建时需要调用os.mkdir就可以实现该操作,然而要创建的目录的父母路首先要存在。否则会发生异常:
>>>os.mkdir("c:\\photos\\zoo\\snakes")
可以使用os.makedirs,该函数可以创建不存在的父目录,例如,下面的代码将在比亚哦的时候创建C:\\photos和C:\\photos\zoo
>>>os.makedirs("C:\\photos\\zoo\\snakes")
使用函数os.rmdir("C:\\photos\\zoo\\snakes")
上面代码只会删除snakes
而shutil.rmtree可以删除目录下包含其他文件和子目录。使用时必须小心,因为传入一个错误路径它将删除一组文件,您甚至不知道发生了什么情况。例如,下面代码删除了完整的图片集,包括zoo,snakes
3.3.8通配
如果您曾经使用过windows系统的cmd或者GUN/Linux等操作系统的shell,可能看到过通配符模式,通配符是一些特殊字符,例如*和?,可以使用它们匹配许多名称类似的文件。如,使用模式P*可以匹配名称P开头的所有文件,*.txt是后缀为.txt文件。
通配不分大小写
我们试着寻找M开头的条目,使用glob.glob返回符合模式的包含磁盘驱动符和目录名称的路径。
在这里,提供其他通配符: