10.文件和异常
学习处理文件,让程序快速的分析大量数据,学习处理错误,避免程序在面对意外时崩溃。学习异常,异常是python创建的特殊对象,用于管理程序运行时出现的错误,提高程序的适用性,可用性,和稳定性。
学习模块json,json可以用于保存用户数据,避免程序意外停止运行时丢失。
学习处理文件和保存数据,可以让程序使用起来更容易,用户可以选择输入什么类型的数据,并选择在什么时候输入,并且可以在使用程序处理一些事后关闭程序,下次在继续做。
学习处理异常,帮助应对文件不存在的情况,以及处理各种可能让程序崩溃的问题,让程序面对各种错误时更健壮,不管这些错误数据源自无意识的错误,还是源自破坏程序的恶意企图。
10.1从文件中读取数据
读取文件可以一次性读取整个文件,也可以逐行读取文件。取决于文件的大小自行选择读取方法。
立即学习“Python免费学习笔记(深入)”;
10.1.1读取整个文件
在 Python 中,读写文件有 3 个步骤:
1.调用 open()函数,返回一个 File 对象。
2.调用 File 对象的 read()或 write()方法。
3.调用 File 对象的 close()方法,关闭该文件。
用 open()函数打开文件
with open(文件名) as file_object:
contents = file_object.read() #不用调用关闭方法,with自动关闭文件。
会在文件当前目录下寻找文件打开。
read()方法读取文件内容
File 对象的 read()方法:
>>> helloContent = helloFile.read()
>>> helloContent
‘Hello world!’
可以使用 readlines()方法,从该文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。
10.1.2文件路径
注意斜杠、Windows 上的倒斜杠以及 OS X 和 Linux 上的正斜杠。
with open(‘text_filesilename.txt’) as file_object。
有两种方法指定一个文件路径。
“绝对路径”, 总是从根文件夹开始。 “相对路径”,它相对于程序的当前工作目录。
绝对文件路径
Win:
file_path = ‘C:Usersehmatthesother_filesext_filesilename.txt’
with open(file_path) as file_object:
Linux和OS:
file_path = ‘/home/ehmatthes/other_files/text_files/filename.txt’
with open(file_path) as file_object:
还有点(.)和点点(..)文件夹。它们不是真正的文件夹,而是可以在路径中使用的特殊名称。单个的句点(“点”)用作文件夹目名称时,是“这个目录”的缩 写。两个句点(“点点”)意思是父文件夹。
处理绝对路径和相对路径
1.os.path 模块提供了一些函数,返回一个相对路径的绝对路径,以及检查给定的路径是否为绝对路径。
2.调用 os.path.abspath(path)将返回参数的绝对路径的字符串。这是将相对路径转换为绝对路径的简便方法。
3.调用 os.path.isabs(path),如果参数是一个绝对路径,就返回 True,如果参数是 一个相对路径,就返回 False。
4.调用 os.path.relpath(path, start)将返回从 start 路径到 path 的相对路径的字符串。
5.如果没有提供 start,就使用当前工作目录作为开始路径。
10.1.3逐行读取文件数据
for line in lines:
replace()替换函数
file.replace(‘dog’, ‘cat’)
10.2写入文件
10.2.1写入空文件
open(‘file’, ‘w’)提供两个实参,文件名和操作
1.读取模式 ’r’
2.写入模式 ‘w’
3.附加模式 ‘a’
4.读取和写入模式 ‘r+’
5.如果省略模式实参,python将只能默认只读模式打开文件。
6.如果文件不存在,open将自动生成文件。
7.输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,或者简写为IO。
8.输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法。
注意,如果以写入模式 ‘w’ 打开,如果文件已经存在,将清空文件。
如果传递给 open()的文件名不存在,写入模式和添加模式都会创建一个新的空文件。在读取或写入文件后,调用 close()方法,然后才能再次打开该文件。
Python只能将字符串写入文本文件,要储存数值数据进入文本文件,需要用函数str将其转化为字符串格式。
>>> baconFile = open(‘bacon.txt’, ‘w’)
>>> baconFile.write(‘Hello world!’)
13
>>> baconFile.close()
>>> baconFile = open(‘bacon.txt’, ‘a’)
>>> baconFile.write(‘Bacon is not a vegetable.’)
25
>>> baconFile.close()
>>> baconFile = open(‘bacon.txt’)
>>> content = baconFile.read()
>>> baconFile.close()
>>> print(content)
Hello world! Bacon is not a vegetable.
首先,我们以写模式打开 bacon.txt。因为还没有 bacon.txt,Python 就创建了一 个。在打开的文件上调用 write(),并向 write()传入字符串参数’Hello world! ‘,将字符串写入文件,并返回写入的字符个数,包括换行符。然后关闭该文件。
为了将文本添加到文件已有的内容,而不是取代我们刚刚写入的字符串,我们就以添加模式打开该文件。向该文件写入’Bacon is not a vegetable.’,并关闭它。最后,为了将文件的内容打印到屏幕上,我们以默认的读模式打开该文件,调用 read(),将得到的内容保存在 content 中,关闭该文件,并打印 content。
请注意,write()方法不会像 print()函数那样,在字符串的末尾自动添加换行字 符。必须自己添加该字符。
用 shelve 模块保存变量
利用 shelve 模块,你可以将 Python 程序中的变量保存到二进制的 shelf 文件中。 这样,程序就可以从硬盘中恢复变量的数据。shelve 模块让你在程序中添加“保存” 和“打开”功能。例如,如果运行一个程序,并输入了一些配置设置,就可以将这 些设置保存到一个 shelf 文件,然后让程序下一次运行时加载它们。
>>> import shelve
>>> shelfFile = shelve.open(‘mydata’)
>>> cats = [‘Zophie’, ‘Pooka’, ‘Simon’]
>>> shelfFile[‘cats’] = cats
>>> shelfFile.close()
在 Windows 上运行前面的代码,你会看到在当前工作目录下有 3 个新文件: mydata.bak、mydata.dat 和 mydata.dir。在 OS X 上,只会创建一个 mydata.db 文件。
这些二进制文件包含了存储在 shelf 中的数据。这些二进制文件的格式并不重要,你只需要知道 shelve 模块做了什么,而不必知道它是怎么做的。该模块让你不用操心如何将程序的数据保存到文件中。 你的程序稍后可以使用 shelve 模块,重新打开这些文件并取出数据。shelf 值不必用读模式或写模式打开,因为它们在打开后,既能读又能写。
>>> shelfFile = shelve.open(‘mydata’)
>>> type(shelfFile)
>>> shelfFile[‘cats’] [‘Zophie’, ‘Pooka’, ‘Simon’]
>>> shelfFile.close()
就像字典一样,shelf 值有 keys()和 values()方法,返回 shelf 中键和值的类似列表的值。因为这些方法返回类似列表的值,而不是真正的列表,所以应该将它们传 递给 list()函数,取得列表的形式。
>>> shelfFile = shelve.open(‘mydata’)
>>> list(shelfFile.keys())
[‘cats’]
>>> list(shelfFile.values())
[[‘Zophie’, ‘Pooka’, ‘Simon’]]
>>> shelfFile.close()
创建文件时,如果你需要在 Notepad 或 TextEdit 这样的文本编辑器中读取它们, 纯文本就非常有用。但是,如果想要保存 Python 程序中的数据,那就使用 shelve 模块。
10.2.2写入多行
函数write()不会在写入的文本后面自动换行,需要自己添加换行符。
10.3 OS操作
10.3.1用 os.makedirs()创建新文件夹
程序可以用 os.makedirs()函数创建新文件夹(目录)。
>>> import os
>>> os.makedirs(‘C:\delicious\walnut\waffles’)
这不仅将创建 C:delicious 文件夹,也会在 C:delicious 下创建 walnut 文件夹, 并在 C:deliciouswalnut 中创建 waffles 文件夹。也就是说,os.makedirs()将创建所有 必要的中间文件夹,目的是确保完整路径名存在。
10.3.2 os.path 模块
os.path 模块包含了许多与文件名和文件路径相关的有用函数。
1.查看文件大小和文件夹内容
一旦有办法处理文件路径,就可以开始搜集特定文件和文件夹的信息。os.path 模块提供了一些函数,用于查看文件的字节数以及给定文件夹中的文件和子文件夹。 调用 os.path.getsize(path)将返回 path 参数中文件的字节数。 调用 os.listdir(path)将返回文件名字符串的列表,包含 path 参数中的每个文件(请注意,这个函数在 os 模块中,而不是 os.path)。 使用了 os.path.join()来连接 文件夹名称和当前的文件名。
2.检查路径有效性
如果你提供的路径不存在,许多 Python 函数就会崩溃并报错。os.path 模块提 供了一些函数,用于检测给定的路径是否存在,以及它是文件还是文件夹。 如果 path 参数所指的文件或文件夹存在,调用 os.path.exists(path)将返回 True, 否则返回 False。 如果 path 参数存在,并且是一个文件,调用 os.path.isfile(path)将返回 True,否 则返回 False。 如果 path 参数存在,并且是一个文件夹,调用 os.path.isdir(path)将返回 True, 否则返回 False。
10.4组织文件
10.4.1 shutil 模块
shutil(或称为 shell 工具)模块中包含一些函数,让你在 Python 程序中复制、移动、改名和删除文件。要使用shutil 的函数,首先需要 import shutil。
10.4.1.1复制文件和文件夹
shutil 模块提供了一些函数,用于复制文件和整个文件夹。
1.调用shutil.copy(source, destination),将路径 source 处的文件复制到路径 destination 处的文件夹(source 和 destination 都是字符串)。
2.如果 destination 是一个文件名,它将 作为被复制文件的新名字。该函数返回一个字符串,表示被复制文件的路径。
>>> import shutil, os
>>> os.chdir(‘C:\’)
>>> shutil.copy(‘C:\spam.txt’,’C:\delicious’)
‘C:\delicious\spam.txt’
>>> shutil.copy(‘eggs.txt’, ‘C:\delicious\eggs2.txt’)
‘C:\delicious\eggs2.txt’
10.4.1.2文件和文件夹的移动与改名
调用 shutil.move(source, destination),将路径 source 处的文件夹移动到路径 destination,并返回新位置的绝对路径的字符串。
如果 destination 指向一个文件夹,source 文件将移动到 destination 中,并保持原来的文件名。
10.5异常
Python使用被称为异常的特殊对象来管理程序运行时发生的错误。
每当python发生不知所措的错误时就会创建一个异常。
如果编写了处理异常的情况,程序将会继续进行,不然程序将会停止,并返回trackback,包含有关异常的报告。
异常使用 try-except 代码块来处理。执行指定的操作,告诉python改怎么办。使用 try-except 代码块,即使程序遇到错误,也会继续运行,显示自己编写的友好错误提示,让用户知道哪里错了。
1.ZeroDivisionError异常
除数为0时,发生的异常。
2.TypeError异常
只允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance()实现
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError(‘bad operand type’)
if x >= 0:
return x
else:
return -x
ValueError异常
3.记录错误
Python内置的logging模块可以非常容易地记录错误信息。
4.抛出错误
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例。
10.6存储数据
使用json模块来存储数据。Json数据的格式并非python专用可以和用其他编程语言的人分享。是一种轻便格式,很有用,也易于学习。
JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被用与众多语言。
使用json.dump() 和json.load()
json.dump()接受两个实参,要存储的数据以及可用于存储数据的文件对象。
存储一组数字的程序 json.dump()将数字读取到内存的程序 json.load()
10.6.2保存和读取用户生成的数据
json.dump和json.load结合使用,分别是存储和载入数据。
10.6.3重构
1.代码可以正确运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程叫重构。重构让代码更清晰,易于理解,更容易扩展。
2.将大部分逻辑放到一个或多个函数内。
10.6.4小结
1.学习了读取文件,整个文件读取和一行读取,操作文件,打开,读取模式,写入模式,附加模式,读取加写入模式。
2.异常处理try-except-else代码块的使用方法。异常类型。操作数据,保存和读取数据,json模块的使用,dump和load的使用,学会重构代码。
10.7调试
1.断言
凡是用print()来辅助查看的地方,都可以用断言(assert)来替代。
def foo(s):
n = int(s)
assert n != 0, ‘n is zero!’
return 10 / n
def main():
foo(‘0’)
assert的意思是,表达式n != 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错。
如果断言失败,assert语句本身就会抛出AssertionError。
以上就是Python基础学习总结(八)的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268122.html