1 文件自动化处理
本节要点:如何使用python在硬盘上创建、读取和保存文件。
1.1.1 文件与文件路径
文件的属性:
路径 | 文件名 |
---|---|
文件在计算机上的位置 | 该位置的文件的名称 |
注1:Windows中文件夹名和文件名不区分大小写;
注2:在windows上,路径书写是使用倒斜杠’‘作为文件夹之间的分隔符,而在OS X和Linux上,是使用正斜杠’/'作为它们的路径分隔符。
引入函数来创建文件名称字符串
os.path.join()
函数用于路径拼接文件路径,可以传入多个参数
该函数注意点:
1、从倒数第一个,以‘/’开头的参数开始拼接,之前的参数全部丢弃;
2、以‘/’结尾的,以及参数中间有‘/’的,斜杠仅作为参数的一部分。
e.p.
1.1.2 当前工作目录
每个运行在计算机上的程序,都有一个“当前工作目录”。
取得当前路径的字符串 | 改变它 |
---|---|
os.getcwd() | os.chdir() |
1.1.3 路径操作
绝对路径 | 相对路径 |
---|---|
总是从根文件夹开始 | 相对于程序的当前工作目录。 |
相对路径
- . :当前目录的缩写
- 两个句点:父文件夹
绝对路径和相对路径处理函数
os.path.abspath(path)
:将相对路径转换为绝对路径,将返回参数的绝对路径的字符串;
os.path.isabs(path)
:判断是否是绝对路径,是返回True,不是则返回False;
- os.path.relpath(path,start):返回从start路径到path的相对路径的字符串。如果没提供start,就使用当前工作目录作为开始路径。
- os.path.dirname(path):返回当前路径的目录名称。
- os.path.basename(path):返回当前路径的文件名称。
1.1.3.3 路径有效性检查
os.path.exists(path)
:如果path参数所指的文件或文件夹存在,则返回True,否则返回False。
os.path.isfile(path)
:如果path参数存在,并且是一个文件,则返回True,否则返回False。
os.path.isdir(path)
:如果path参数存在,并且是一个文件夹,则返回True,否则返回False。
1.1.4 文件及文件夹操作
1.1.4.1 用os.makedirs()创建新文件夹
创建新文件夹:os.makedirs()
注:os.makedirs()
可以创建所有必要的中间文件夹。
1.1.4.2 查看文件大小和文件夹内容
os.path.getsize(path)
:返回path参数中文件的字节数。
os.listdir(path)
:返回文件名字符串的列表,包含path参数中的每个文件。
1.1.6 文件读写过程
读写文件3个步骤:
1.调用open()
函数,返回一个File对象。
2.调用File对象的read()
或write()
方法。
3.调用File对象的close()
方法,关闭该文件。
1.1.6.1 用open()函数打开文件
1.1.6.2 读取文件内容
read()
:读取文件内容。
readlines()
:按行读取文件中的内容,取得一个字符串列表,列表中每个字符串是文本中的一行且以\n结束。
1.1.6.3 写入文件
‘w’ | ‘a’ |
---|---|
写模式(覆盖,从头开始) | 添加模式(添加) |
注:write()
方法不会像print()函数那样,在字符串的末尾自动添加换行字符。必须自己添加该字符。
1.1.6.3 保存变量
1)shelve模块
用shelve
模块,可以将Python中的变量保存到二进制的shelf
文件中。这样,程序就可以从硬盘中恢复变量的数据。
注:shelf
值不必用读模式或写模式打开,因为打开后,既能读又能写。
shelf
值有keys()
和values()
方法,返回shelf中键和值的类似列表的值。但是这些方法返回类似列表的值,却不是真正的列表,所以应该将它们传递给list()
函数,取得列表的形式。
2)、用pprint.pformat()
函数保存变量
如果 有一个字典,保存在一个变量中,希望保存这个变量和它的内容,以便将来使用。***pprint.pformat()函数将提供一个字符串,我们可以将它写入.py文件。***这个文件可以成为我们自己的模块,如果需要使用存储其中的变量,就可以导入它。
用atom打开
1.1.7 练习
1、如果已有的文件以写模式打开,会发生什么?
A:用写的模式打开,将会覆盖原来已有的内容,用添加模式打开,将不会覆盖。
2、read()
和readlines()
方法之间的区别是什么?
read()模式:读取的内容将不分行写出,
readlines()模式:读取的内容将以字符串列表形式表出,分行表出。
综合练习:
一、生成随机的测验试卷文件
假如你是一位地理老师, 班上有 35 名学生, 你希望进行美国各州首府的一个小测验。不妙的是,班里有几个坏蛋, 你无法确信学生不会作弊。你希望随机调整问题的次序, 这样每份试卷都是独一无二的, 这让任何人都不能从其他人那里抄袭答案。当然,手工完成这件事又费时又无聊。 好在, 你懂一些 Python。
下面是程序所做的事:
• 创建 35 份不同的测验试卷。
• 为每份试卷创建 50 个多重选择题,次序随机。
• 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
• 将测验试卷写到 35 个文本文件中。
• 将答案写到 35 个文本文件中。
这意味着代码需要做下面的事:
• 将州和它们的首府保存在一个字典中。
• 针对测验文本文件和答案文本文件,调用 open()、 write()和 close()。
• 利用 random.shuffle()随机调整问题和多重选项的次序。
1.2 组织文件
1.2.1 shutil模块
shutil
(或称为shell工具)模块中包含一些函数,可以在Python程序中复制、移动、改名和删除文件。
要使用shutil
的函数,首先需要import shutil
1.2.1.1 复制文件和文件夹
shutil.copy(source, destination)
:将路径source处的文件复制到路径 destination处的文件夹(source 和 destination 都是字符串),并返回新复制文件绝对路径字符串。
shutil.copy(source, destination)
:将路径source处的文件复制到路径 destination处的文件夹(source 和 destination 都是字符串),并返回新复制文件绝对路径字符串。
注:destination可以是:
1)、一个文件的名称,则将source文件复制为新名称的destination
2)、一个文件夹,则将source文件复制到destination中
shutil.copytree(source, destination)
:将路径source处的文件夹,包括其包含的文件夹和文件,复制到路径destination处的文件夹,并返回新复制文件夹绝对路径字符串。
注:destination处的文件夹为新创建的文件夹,如已存在,则会报错。
1.2.1.3 永久删除文件和文件夹
1.2.2 遍历目录树
os.walk(path)
:传入一个文件夹的路径,在for循环语句中使用os.walk()
函数,遍历目录树,和range()函数遍历一个范围的数字类似。不同的是,os.walk()
在循环的每次迭代中,返回三个值:
1)当前文件夹称的字符串。
2)当前文件夹中子文件夹的字符串的列表。
3)当前文件夹中文件的字符串的列表。
注:当前文件夹,是指for循环当前迭代的文件夹。程序的当前工作目录,不会因为os.walk()
而改变。
1.2.3 用zipfile模块压缩文件
1.2.3.1 创建和添加到zip文件
zipfile.ZipFile('filename.zip', 'w')
:以写模式创建一个压缩文件
ZipFile
对象的 write('filename','compress_type=zipfile.ZIP_DEFLATED')
方法:如果向write()
方法中传入一个路径,Python 就会压缩该路径所指的文件, 将它加到 ZIP 文件中。 如果向write()
方法中传入一个字符串,代表要添加的文件名。第二个参数是“压缩类型”参数,告诉计算机用怎样的算法来压缩文件。可以总是将这个值设置为 zipfile.ZIP_DEFLATED
。
1.2.3.2 读取zip文件
调用zipfile.ZipFile(filename)
函数创建一个ZipFile
对象(注意大写字母Z和F),filename是要读取zip文件的文件名。
ZipFile
对象中的两个常用方法:
namelis()
方法,返回zip文件中包含的所有文件和文件夹的字符串列表。
getinfo()
方法,返回一个关于特定文件的ZipInfo
对象。
ZipInfo
对象的两个属性:file_size
和compress_size
,分别表示原来文件大小和压缩后文件大小。
1.2.3.2 读取zip文件
2 自动发送电子邮件
注:1.文件要放在绝对路径
2.出现:smtp出现(500, b’Error: bad syntax’):参见blog.csdn.net/weixin_38428827/article/details/104223207