--- layout: post # 使用的布局(不需要改) title: 「Python教程13」文件与文件路径 # 标题 subtitle: Python学习笔记 #副标题 date: 2019-10-16 # 时间 author: Duter2016 # 作者 header-img: img/post-bg-dutbs.jpg #这篇文章标题背景图片 header-mask: "0.1" # 博文页面上端的背景图片的亮度,数值越大越黑暗 catalog: true # 开启catalog,将在博文侧边展示博文的结构 istop: false # 设为true可把文章设置为置顶文章 music-id: # 网易云音乐单曲嵌入 music-idfull: # 网易云音乐歌单嵌入 tags: #标签 - Python - 教程 --- ## 1、文件名书写   文件夹名称和文件名在Windows和OS X上是不区分大小写的,但在Linux上是区分大小写的。 ## 2、路径书写(Windows上的倒斜杠以及OS X和Linux上的正斜杠)   在Windows上,路径书写使用倒斜杠作为文件夹之间的分隔符。但在OS X和Linux上,使用正斜杠作为它们的路径分隔符。如果想要程序运行在所有操作系统上,在编写Python脚本时,就必须处理这两种情况。   好在,用os.path.join()函数来做这件事很简单。如果将单个文件和路径上的文件夹名称的字符串传递给它,os.path.join()就会返回一个文件路径的字符串,包含正确的路径分隔符。在交互式环境中输入以下代码: ``` >>> import os >>> os.path.join('usr', 'bin', 'spam') 'usr\\bin\\spam' ``` 我在Windows上运行这些交互式环境的例子,所以,os.path .join('usr', 'bin', 'spam')返回'usr\bin\spam'(请注意,倒斜杠有两个,因为每个倒斜杠需要由另一个倒斜杠字符来转义)。如果我在OS X或Linux上调用这个函数,该字符串就会是'usr/bin/spam'。 ## 3、当前工作目录   每个运行在计算机上的程序,都有一个“当前工作目录”,或cwd。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。利用os.getcwd()函数,可以取得当前工作路径的字符串,并可以利用os.chdir()改变它。在交互式环境中输入以下代码: ``` >>> import os >>> os.getcwd() 'C:\\Python34' >>> os.chdir('C:\\Windows\\System32') >>> os.getcwd() 'C:\\Windows\\System32' ``` 这里,当前工作目录设置为C:\Python34,所以文件名project.docx指向C:\Python34\project.docx。如果我们将当前工作目录改为C:\Windows,文件就被解释为C:\Windows\project.docx。 ## 4、绝对路径与相对路径 点(.)和点点(..)文件夹。单个的句点(“点”)用作文件夹目名称时,是“这个目录”的缩写。两个句点(“点点”)意思是父文件夹。 图8-2是一些文件夹和文件的例子。如果当前工作目录设置为C:\bacon,这些文件夹和文件的相对目录,就设置为图8-2所示的样子。 ![title](https://raw.githubusercontent.com/Duter2016/GitNote-images/master/Images/2019/04/15/1555338855144-1555338855154.png) ## 5、用os.makedirs()创建新文件夹 程序可以用os.makedirs()函数创建新文件夹(目录)。在交互式环境中输入以下代码: ``` >>> import os >>> os.makedirs('C:\\delicious\\walnut\\waffles') ``` 这不仅将创建C:\delicious文件夹,也会在C:\delicious下创建walnut文件夹,并在C:\delicious\walnut中创建waffles文件夹。也就是说,os.makedirs()将创建所有必要的中间文件夹,目的是确保完整路径名存在。 ## 6、os.path处理绝对路径和相对路径 os.path模块提供了一些函数,返回一个相对路径的绝对路径,以及检查给定的路径是否为绝对路径。 (1)调用os.path.abspath(path)将返回参数的绝对路径的字符串。这是将相对路径转换为绝对路径的简便方法。 (2)调用os.path.isabs(path),如果参数是一个绝对路径,就返回True,如果参数是一个相对路径,就返回False。 (3)调用os.path.relpath(path, start)将返回从start路径到path的相对路径的字符串。如果没有提供start,就使用当前工作目录作为开始路径。 在交互式环境中尝试以下函数: ``` >>> os.path.abspath('.') 'C:\\Python34' >>> os.path.abspath('.\\Scripts') 'C:\\Python34\\Scripts' >>> os.path.isabs('.') False >>> os.path.isabs(os.path.abspath('.')) True ``` 在交互式环境中,输入以下对os.path.relpath()的调用: ``` >>> os.path.relpath('C:\\Windows', 'C:\\') 'Windows' >>> os.path.relpath('C:\\Windows', 'C:\\spam\\eggs') '..\\..\\Windows' >>> os.getcwd() 'C:\\Python34' ``` (4)调用os.path.dirname(path)将返回一个字符串,它包含path参数中最后一个斜杠之前的所有内容。调用os.path.basename(path)将返回一个字符串,它包含path 参数中最后一个斜杠之后的所有内容。一个路径的目录名称和基本名称如图8-4所示。 ![title](https://raw.githubusercontent.com/Duter2016/GitNote-images/master/Images/2019/04/15/1555338912053-1555338912054.png) 图8-4 基本名称跟在路径中最后一个斜杠后,它和文件名一样,目录名称是最后一个斜杠之前的所有内容 例如,在交互式环境中输入以下代码: ``` >>> path = 'C:\\Windows\\System32\\calc.exe' >>> os.path.basename(path) 'calc.exe' >>> os.path.dirname(path) 'C:\\Windows\\System32' ``` 如果同时需要一个路径的目录名称和基本名称,就可以调用os.path.split(),获得这两个字符串的元组,像这样: ``` >>> calcFilePath = 'C:\\Windows\\System32\\calc.exe' >>> os.path.split(calcFilePath) ('C:\\Windows\\System32', 'calc.exe') ``` 请注意,可以调用os.path.dirname()和os.path.basename(),将它们的返回值放在一个元组中,从而得到同样的元组。 ``` >>> (os.path.dirname(calcFilePath), os.path.basename(calcFilePath)) ('C:\\Windows\\System32', 'calc.exe') ``` 但如果需要两个值,os.path.split()是很好的快捷方式。 (5)注意,os.path.split()不会接受一个文件路径并返回每个文件夹的字符串的列表。如果需要这样,请使用split()字符串方法,并根据os.path.sep中的字符串进行分割。回忆一下,根据程序运行的计算机,os.path.sep变量设置为正确的文件夹分割斜杠。 例如,在交互式环境中输入以下代码: ``` >>> calcFilePath.split(os.path.sep) ['C:', 'Windows', 'System32', 'calc.exe'] ``` 在OS X和Linux系统上,返回的列表头上有一个空字符串: ``` >>> '/usr/bin'.split(os.path.sep) ['', 'usr', 'bin'] ``` split()字符串方法将返回一个列表,包含该路径的所有部分。如果向它传递os.path.sep,就能在所有操作系统上工作。 ## 7、查看文件大小和文件夹内容 (1)调用os.path.getsize(path)将返回path参数中文件的字节数。 (2)调用os.listdir(path)将返回文件名字符串的列表,包含path参数中的每个文件(请注意,这个函数在os模块中,而不是os.path)。 下面是我在交互式环境中尝试这些函数的结果: ``` >>> os.path.getsize('C:\\Windows\\System32\\calc.exe') 776192 >>> os.listdir('C:\\Windows\\System32') ['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll', --_snip_-- 'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll'] ``` 可以看到,我的计算机上的calc.exe程序是776192字节。在我的C:\Windows\ system32下有许多文件。如果想知道这个目录下所有文件的总字节数,就可以同时使用os.path.getsize()和os.listdir()。 ``` >>> totalSize = 0 >>> for filename in os.listdir('C:\\Windows\\System32'): totalSize = totalSize + os.path.getsize(os.path.join('C:\\Windows\\System32', filename))  >>> print(totalSize) 1117846456 ``` ## 8、检查路径有效性 (1)如果path参数所指的文件或文件夹存在,调用os.path.exists(path)将返回True,否则返回False。 (2)如果path参数存在,并且是一个文件,调用os.path.isfile(path)将返回True,否则返回False。 (3)如果path参数存在,并且是一个文件夹,调用os.path.isdir(path)将返回True,否则返回False。 下面是我在交互式环境中尝试这些函数的结果: ``` >>> os.path.exists('C:\\Windows') True >>> os.path.exists('C:\\some_made_up_folder') False >>> os.path.isdir('C:\\Windows\\System32') True >>> os.path.isfile('C:\\Windows\\System32') False >>> os.path.isdir('C:\\Windows\\System32\\calc.exe') False >>> os.path.isfile('C:\\Windows\\System32\\calc.exe') True ``` (4)利用os.path.exists()函数,可以确定DVD或闪存盘当前是否连在计算机上。例如,如果在Windows计算机上,我想用卷名D:\检查一个闪存盘,可以这样做: ``` >>> os.path.exists('D:\\') False ``` 不好!看起来我忘记插入闪存盘了。