我们知道,程序运行时,可以用变量来保存运算结果,但如果希望程序运行关闭后,依然可以查看运行后的结果,就需要将数据保存到文件中。简单点,你可以将文件内容理解为一个字符串值,大小可能有几个GB。本节将学习,如何使用python在硬盘上创建、读取和保存文件。
1.1文件处理
1.1.1 文件与文件路径
文件的两个属性:“路径”和“文件名”,路径指明文件在计算机上的位置,文件名是指该位置的文件的名称。比如,我的电脑上,有个名字为Datawhale - 开源发展理论研究.pdf的文件,它的路径在D:\Datawhale。在windows中,路径中的D:\部分是“根文件夹”,Datawhale是文件夹名。注:Windows中文件夹名和文件名不区分大小写的。
在windows上,路径书写是使用倒斜杠'\'
作为文件夹之间的分隔符,而在OS X和Linux上,是使用正斜杠'/'
作为它们的路径分隔符。通常我们用os.path.join()
函数来创建文件名称字符串。
In [ ]:
import os os.path.join('Datawhale','docu')
Out[ ]:
'Datawhale\\docu'
我们可以看到返回的是('Datawhale\\docu')
,有两个斜杠,这是因为有一个斜杠是用来转义的,在OS X或Linux上调用这个函数,这个字符串就会是'Datawhale/docu'
。
1.1.2 当前工作目录
每个运行在计算机上的程序,都有一个“当前工作目录”。利用os.getcwd()
函数,可以取得当前工作路径的 字符串,并可以利用os.chdir()
改变它。
In [ ]:
import os os.getcwd()
Out[ ]:
'd:\\打卡学习\\OfficeAutomation\\source'
In [ ]:
os.chdir('d:\\打卡学习\\OfficeAutomation') os.getcwd()
Out[ ]:
'd:\\打卡学习\\OfficeAutomation'
In [ ]:
os.chdir('d:\\打卡学习\\OfficeAutomation\\source')
1.1.3 路径操作
1.1.3.1 绝对路径和相对路径
“绝对路径”,总是从根文件夹开始。
“相对路径”,相对于程序的当前工作目录。
相对路径中,单个句点“.”
表示当前目录的缩写,两个句点“..”
表示父文件夹。
几个常用的绝对路径和相对路径处理函数
os.path.abspath(path)
:将相对路径转换为绝对路径,将返回参数的绝对路径的字符串。os.path.isabs(path)
:判断是否是绝对路径,是返回True,不是则返回False
In [ ]:
os.path.abspath('.') # 'd:\\打卡学习\\OfficeAutomation\\source' os.path.isabs('.') # False os.path.isabs(os.path.abspath('.'))
Out[ ]:
True
1.1.3.2 路径操作
os.path.relpath(path,start)
:返回从start路径到path的相对路径的字符串。如果没提供start,就使用当前工作目录作为开始路径。
os.path.dirname(path)
: 返回当前路径的目录名称。
os.path.basename(path)
:返回当前路径的文件名称。
In [ ]:
os.path.relpath(r'D:\\',os.getcwd())
Out[ ]:
'..\\..\\..'
In [ ]:
path = os.getcwd() # 'd:\\打卡学习\\OfficeAutomation\\source' # path os.path.dirname(path) # 'd:\\打卡学习\\OfficeAutomation'
Out[ ]:
'd:\\打卡学习\\OfficeAutomation'
In [ ]:
os.path.basename(os.getcwd()) # 'source'
Out[ ]:
'source'
如果同时需要一个路径的目录名称和基本名称,可以调用os.path.split()
,获得者两个字符串的元组。
In [ ]:
caFilePath = 'D:\\Datawhale\\python办公自动化\\python课程画图.pptx' os.path.split(caFilePath) # ('D:\\Datawhale\\python办公自动化', 'python课程画图.pptx')
Out[ ]:
('D:\\Datawhale\\python办公自动化', 'python课程画图.pptx')
我们也可以调用os.path.dirname()
和os.path.basename()
,将它们的返回值放在一个元组中,从而得到同样的元组。
In [ ]:
(os.path.dirname(caFilePath),os.path.basename(caFilePath)) #('D:\\Datawhale\\python办公自动化', 'python课程画图.pptx')
Out[ ]:
('D:\\Datawhale\\python办公自动化', 'python课程画图.pptx')
如果我们想返回每个文件夹的字符串的列表。用os.path.split()
无法得到,我们可以用split()
字符串方法,并根据os.path.sep
中的字符串进行分割。os.path.sep
变量设置为正确的文件夹分割斜杠。
In [ ]:
os.path.sep # '\\' caFilePath.split(os.path.sep)
Out[ ]:
['D:', 'Datawhale', 'python办公自动化', 'python课程画图.pptx']
1.1.3.3 路径有效性检查
如果提供的路径不存在,很多Python函数就会崩溃并报错。os.path
模块提供了一些函数,用于检测给定的路径是否存在,以及判定是文件还是文件夹。
os.path.exists(path)
:如果path参数所指的文件或文件夹存在,则返回True,否则返回False。
os.path.isfile(path)
:如果path参数存在,并且是一个文件,则返回True,否则返回False。
os.path.isdir(path)
:如果path参数存在,并且是一个文件夹,则返回True,否则返回False。
In [ ]:
os.path.exists('C:\\windows')
Out[ ]:
True
In [ ]:
os.path.exists('C:\\fasfa')
Out[ ]:
False
In [ ]:
os.path.isfile('D:\打卡学习\OfficeAutomation\Task01 文件自动化与邮件处理.md')
Out[ ]:
True
In [ ]:
os.path.isfile('D:\打卡学习\OfficeAutomation')
Out[ ]:
False
In [ ]:
os.path.isdir('D:\打卡学习\OfficeAutomation\Task01 文件自动化与邮件处理.md')
Out[ ]:
False
In [ ]:
os.path.isdir('D:\打卡学习\OfficeAutomation')
Out[ ]:
True
1.1.4 文件及文件夹操作
1.1.4.1 用os.makedirs()创建新文件夹
注:os.makedirs()
可以创建所有必要的中间文件夹。
In [ ]:
import os os.makedirs('D:\打卡学习\OfficeAutomation\\test_makedir') #查看目录,已创建,若文件夹已存在,不会覆盖,会报错
1.1.4.2 查看文件大小和文件夹内容
我们已经可以处理文件路径,这是操作文件及文件夹的基础。接下来,我们可以搜集特定文件和文件夹的信息。os.path
模块提供了一些函数,用于查看文件的字节数以及给定文件夹中的文件和子文件夹。
os.path.getsize(path)
:返回path参数中文件的字节数。
os.listdir(path)
:返回文件名字符串的列表,包含path参数中的每个文件。
In [ ]:
os.path.getsize(r'D:\打卡学习\OfficeAutomation\Task01 文件自动化与邮件处理.md')
Out[ ]:
29234
In [ ]:
os.listdir(r'D:\打卡学习\OfficeAutomation')
Out[ ]:
['pdf版本', 'pdf版本.zip', 'readme.md', 'source', 'Task01 文件自动化与邮件处理.md', 'Task02 Python与Excel.md', 'Task03 python与word.md', 'Task04 python与pdf.md', 'Task05 爬虫入门与综合应用.md', 'test.xlsx', 'test_1.xlsx', 'test_makedir', '图片', '用户行为偏好.xlsx']
如果想知道目录下所有文件的总字节数,可以同时使用os.path.getsize()
和os.listdir()
In [ ]:
total_size = 0 for filename in os.listdir(r'D:\打卡学习\OfficeAutomation'): total_size += os.path.getsize(os.path.join(r'D:\打卡学习\OfficeAutomation',filename)) total_size
Out[ ]:
8688544
1.1.5 文件读写过程
读写文件3个步骤:
1.调用open()
函数,返回一个File对象。
2.调用File对象的read()
或write()
方法。
3.调用File对象的close()
方法,关闭该文件。
1.1.5.1 用open()函数打开文件
要用open()
函数打开一个文件,就要向它传递一个字符串路径,表明希望打开的文件。这既可以是绝对路径,也可以是相对路径。open()
函数返回一个File对象。 先用TextEdit创建一个文本文件,名为hello.txt。输入Hello World!作为该文本文件的内容,将它保存在你的用户文件夹中。
In [ ]:
helloFile = open(r'D:\打卡学习\OfficeAutomation\test_1.xlsx') print(helloFile) helloFile.close()
<_io.TextIOWrapper name='D:\\打卡学习\\OfficeAutomation\\test_1.xlsx' mode='r' encoding='cp936'>
1.1.5.2 读取文件内容
有了File对象,我们就可以开始从它读取内容。
read()
:读取文件内容。
readlines()
:按行读取文件中的内容,取得一个字符串列表,列表中每个字符串是文本中的一行且以\n结束。
In [ ]:
helloFile = op