读写文件
2019年05月06日 18:30:18
《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版
8.1 文件与文件路径
8.1.1 正斜杠
Windows 上的倒斜杠以及 OS X 和 Linux 上的正斜杠。在 Windows 上,路径书写使用倒斜杠
作为文件夹之间的分隔符。
但在 OS X 和Linux 上,使用正斜杠
作为它们的路径分隔符。
如果想要程序运行在所有操作系统上,在编写 Python 脚本时,就必须处理这两种情况。
用 os.path.join()[1]函数来做这件事很简单。如果将单个文件和路径上的文件夹名称的字符串传递给它,os.path.join()就会返回一个文件路径的字符串,包含正确的路径分隔符。在交互式环境中输入以下代码:
>>> import os
>>> os.path.join('user','bin','spam')
'user\\bin\\spam'
如果我在 OS X 或 Linux 上调用这个函数,该字符串就会是'usr/bin/spam'。
下面的例子将一个文件名列表中的名称,添加到文件夹名称的末尾。
myFiles = ['第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf',
'第2本:《Python编程:从入门到实践》.pdf',
'第3本:《Python核心编程(第3版)》@玉姐.pdf']
for filename in myFiles:
print(os.path.join('f:\[008]Python\[001]分类学习\基础学习',filename))
# 输出:
f:\[008]Python\[001]分类学习\基础学习\第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf
f:\[008]Python\[001]分类学习\基础学习\第2本:《Python编程:从入门到实践》.pdf
f:\[008]Python\[001]分类学习\基础学习\第3本:《Python核心编程(第3版)》@玉姐.pdf
8.1.2 当前工作目录
每个运行在计算机上的程序,都有一个“当前工作目录”,或 cwd。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。利用 os.getcwd()
[2]函数,可以取得当前工作路径的字符串,并可以利用 os.chdir()
[3]改变它。在交互式环境中输入以下代码:
>>> import os
>>> os.getcwd()
'E:\\坚果云\\[014] eDiary学习笔记\\[001] 代码学习\\Python\\代码片段\\2019-05-03-利用python操作Excel表'
>>> os.chdir('e:\坚果云\[014] eDiary学习笔记')
>>> os.getcwd()
'e:\\坚果云\\[014] eDiary学习笔记'
8.1.3 绝对路径与相对路径
有两种方法指定一个文件路径。
- “绝对路径”,总是从根文件夹开始。
- “相对路径”,它相对于程序的当前工作目录。
还有点.
和点点..
文件夹。它们不是真正的文件夹,而是可以在路径中使用的特殊名称。
- 单个的句点(“点”)用作文件夹目名称时,是“这个目录”的缩写。
- 两个句点(“点点”)意思是父文件夹。
相对路径开始处的.\是可选的
。例如,.\spam.txt 和 spam.txt 指的是同一个文件。
8.1.4 用 os.makedirs()创建新文件夹
>>> import os
>>> os.getcwd()
'e:\\坚果云\\[014] eDiary学习笔记'
>>> os.chdir('f:\[008]Python\[001]分类学习\基础学习')
>>> os.getcwd()
'f:\\[008]Python\\[001]分类学习\\基础学习'
>>> os.makedirs('f:\\[008]Python\\[001]分类学习\\基础学习\\1\\2')
8.1.5 os.path 模块
http://docs.python.org/3/library/os.path.html
8.1.6 处理绝对路径和相对路径
os.path 模块提供了一些函数,返回一个相对路径的绝对路径,以及检查给定的路径是否为绝对路径。
- 调用
os.path.abspath(path)
[4]将返回参数的绝对路径的字符串。这是将相对路径转
换为绝对路径的简便方法。 - 调用
os.path.isabs(path)
[5],如果参数是一个绝对路径,就返回 True,如果参数是
一个相对路径,就返回 False。 - 调用
os.path.relpath(path, start)
[6]将返回从 start 路径到 path 的相对路径的字符串。
如果没有提供 start,就使用当前工作目录作为开始路径。
>>> os.path.abspath('.')
'f:\\[008]Python\\[001]分类学习\\基础学习'
>>> os.path.abspath('.\\1')
'f:\\[008]Python\\[001]分类学习\\基础学习\\1'
>>> os.path.isabs('.')
False
>>> os.path.isabs(os.path.abspath('.'))
True
>>> os.path.relpath('f:\[008]Python\[001]分类学习\基础学习','f:\[008]Python')
'[001]分类学习\\基础学习'
调用 os.path.dirname(path)
[7]将返回一个字符串,它包含 path 参数中最后一个斜杠之前的所有内容。调用 os.path.basename(path)
[8]将返回一个字符串,它包含 path 参数中最后一个斜杠之后的所有内容。一个路径的目录名称和基本名称如图 8-4 所示。
>>> os.path.dirname('f:\[008]Python\[001]分类学习\基础学习\第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf')
'f:\\[008]Python\\[001]分类学习\\基础学习'
>>> os.path.basename('f:\[008]Python\[001]分类学习\基础学习\第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf')
'第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf'
如果同时需要一个路径的目录名称和基本名称,就可以调用 os.path.split()
[9],获得这两个字符串的元组
>>> name = 'f:\[008]Python\[001]分类学习\基础学习\第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf'
>>> os.path.split(name)
('f:\\[008]Python\\[001]分类学习\\基础学习', '第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf')
可以调用 os.path.dirname()和 os.path.basename(),将它们的返回值放在一个元组中,从而得到同样的元组。
>>> (os.path.dirname(name), os.path.basename(name))
('f:\\[008]Python\\[001]分类学习\\基础学习', '第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf')
注意:
os.path.split()不会接受一个文件路径并返回每个文件夹的字符串的列表。
如果需要这样,请使用split()字符串方法,并根据 os.path.sep
[10] 中的字符串进行分割。
根据程序运行的计算机,os.path.sep 变量设置为正确的文件夹分割斜杠。
>>> name.split(os.path.sep)
['f:', '[008]Python', '[001]分类学习', '基础学习', '第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf']
split()字符串方法将返回一个列表,包含该路径的所有部分。如果向它传递os.path.sep,就能在所有操作系统上工作。
8.1.7 查看文件大小和文件夹内容
一旦有办法处理文件路径,就可以开始搜集特定文件和文件夹的信息。os.path 模块提供了一些函数,用于查看文件的字节数以及给定文件夹中的文件和子文件夹。
-
调用
os.path.getsize(path)
[11]将返回 path 参数中文件的字节数。 -
调用
os.listdir(path)
[12]将返回文件名字符串的列表,包含 path 参数中的每个文件请注意,这个函数在 os 模块中,而不是 os.path
>>> os.path.getsize('f:\[008]Python\[001]分类学习\基础学习\第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf')
14955982
>>> os.listdir('.')
['1', '第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf', '第2本:《Python编程:从入门到实践》.pdf', '第3本:《Python核心编程(第3版)》@玉姐.pdf']
计算文件夹总大小:
>>> totalSize = 0
>>> for fileName in os.listdir('f:\[008]Python\[001]分类学习\基础学习'):
totalSize = totalSize + os.path.getsize(fileName)
>>> print(totalSize)
53969252
或者:
>>> totalSize = 0
>>> for fileName in os.listdir('f:\[008]Python\[001]分类学习\基础学习'):
totalSize = totalSize + os.path.getsize(os.path.join('f:\[008]Python\[001]分类学习\基础学习',fileName))
>>> print(totalSize)
53969252
8.1.8 检查路径有效性
如果你提供的路径不存在,许多 Python 函数就会崩溃并报错。os.path 模块提供了一些函数,用于检测给定的路径是否存在,以及它是文件还是文件夹。
- 如果 path 参数所指的文件或文件夹存在,调用
os.path.exists(path)
[13] 将返回 True,
否则返回 False。 - 如果 path 参数存在,并且是一个文件,调用
os.path.isfile(path)
[14] 将返回 True,否
则返回 False。 - 如果 path 参数存在,并且是一个文件夹,调用
os.path.isdir(path)
[15] 将返回 True,
否则返回 False。
>>> os.path.exists('f:\[008]Python\[001]分类学习\基础学习')
True
>>> os.path.exists('f:\[008]Python\[001]分类学习\基础学习1')
False
>>> os.path.isdir('f:\[008]Python\[001]分类学习\基础学习')
True
>>> os.path.isfile('f:\[008]Python\[001]分类学习\基础学习')
False
>>> os.path.isfile('f:\[008]Python\[001]分类学习\基础学习\第1本:《Python编程快速上手—让繁琐工作自动化》 PDF中文高清晰完整版.pdf')
True
>>> os.path.exists('f:\\')
True
>>> os.path.exists('g:\\')
False
8.2 文件读写过程
(待更新)
-
os.path.join() ↩
-
os.getcwd() ↩
-
os.chdir() ↩
-
os.path.abspath(path) ↩
-
os.path.isabs(path) ↩
-
os.path.relpath(path, start) ↩
-
os.path.dirname(path) ↩
-
os.path.basename(path) ↩
-
os.path.split() ↩
-
os.path.sep ↩
-
os.path.getsize(path) ↩
-
os.listdir(path) ↩
-
os.path.exists(path) ↩
-
os.path.isfile(path) ↩
-
os.path.isdir(path) ↩
网友评论