10.文件和异常

  1.学习处理文件,让程序快速的分析大量数据,学习处理错误,避免程序在面对意外时崩溃。学习异常,异常是python创建的特殊对象,用于管理程序运行时出现的错误,提高程序的适用性,可用性,和稳定性。

  2.学习模块json,json可以用于保存用户数据,避免程序意外停止运行时丢失。

  3.学习处理文件和保存数据,可以让程序使用起来更容易,用户可以选择输入什么类型的数据,并选择在什么时候输入,并且可以在使用程序处理一些事后关闭程序,下次在继续做。

  4.学习处理异常,帮助应对文件不存在的情况,以及处理各种可能让程序崩溃的问题,让程序面对各种错误时更健壮,不管这些错误数据源自无意识的错误,还是源自破坏程序的恶意企图。

10.1 从文件中读取数据

  读取文件可以一次性读取整个文件,也可以逐行读取文件。取决于文件的大小自行选择读取方法。

10.1.1 读取整个文件

  方法1:读写文件有 3 个步骤,

  1.调用 open()函数,返回一个 File 对象。

  2.调用 File 对象的 read()或 write()方法。

  3.调用 File 对象的 close()方法,关闭该文件。必须关闭,不然会出错。

  方法2:用with  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_files\filename.txt') as file_object。

  有两种方法指定一个文件路径。

  •   “绝对路径”, 总是从根文件夹开始。
  •   “相对路径”,它相对于程序的当前工作目录。

  绝对文件路径

  1.Win:

  file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt’

  with open(file_path) as file_object:

  2.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 逐行读取文件数据

  lines = f.readlines()

  for line in lines:

      print(line)

10.2 写入文件

10.2.1 写入空文件

  open(‘file’, ‘w’)提供两个实参,文件名和操作, open()函数支持 encoding, errors, newline 等关键字参数。

  1.读取模式 ’r’

  2.写入模式 ‘w’, 写入二进制用‘wb’

  3.附加模式 ‘a’

  4.读取和写入模式 ‘r+’

  5.rt模式,读取文本时会自动把\r\n转换成\n。

  6.wt模式,写文件时会用\r\n来表示换行。

  7.如果省略模式实参,python将只能默认只读模式打开文件。

  8.如果文件不存在,open将自动生成文件。

  9.输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,或者简写为IO。

  10.输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法。

  11.使用 x 模式替换 w 模式,可以检查文件是否存在,不存在则写入数据,存在则报错。

>>> with open()'somefilr', 'wt') as f:
... f.write('Hello\n')
...
>>> with open('somefile', 'xt') as f:
... f.write('Hello\n')
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Error 17] File exists: 'somefile'

  注意,如果以写入模式 ‘w’ 打开,如果文件已经存在,将清空文件。

  如果传递给 open()的文件名不存在,写入模式和添加模式都会创建一个新的空文件。在读取或写入文件后,调用 close()方法,然后才能再次打开该文件。

  Python只能将字符串写入文本文件,要储存数值数据进入文本文件,需要用函数str将其转化为字符串格式。

>>> baconFile = open('bacon.txt', 'w')
>>> baconFile.write('Hello world!\n')
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! \n',将字符串写入文件,并返回写入的字符个数,包括换行符。然后关闭该文件。

  为了将文本添加到文件已有的内容,而不是取代我们刚刚写入的字符串,我们就以添加模式打开该文件。向该文件写入'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)
<class 'shelve.DbfilenameShelf'>
>>> 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.3 OS操作

10.3.1 用 os.makedirs()创建新文件夹

  程序可以用 os.makedirs()函数创建新文件夹(目录)。

>>> import os
>>> os.makedirs('C:\\delicious\\walnut\\waffles')

  这不仅将创建 C:\delicious 文件夹,也会在 C:\delicious 下创建 walnut 文件夹, 并在 C:\delicious\walnut 中创建 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语句抛出一个错误的实例。

5. finally从句

  包裹到finally从句中的代码不管异常是否触发都将会被执⾏。这可以被⽤来在脚本执⾏之后做清理⼯作。

 try:
file = open('test.txt', 'rb')
except IOError as e:
print('An IOError occurred. {}'.format(e.args[-1]))
finally:
print("This would be printed whether or not an exception occurred”)

6. try/else从句

  在没有触发异常的时候执⾏⼀些代码。这可以很轻松地通过⼀个else从句来达到。

 try:
  print('I am sure no exception is going to occur!') ‘
except Exception:
  print('exception')
else:
  # 这⾥的代码只会在try语句⾥没有触发异常时运⾏,
  # 但是这⾥的异常将 *不会* 被捕获
  print('This would only run if no exception occurs. And an error here would NOT be caught.')
finally:
  print('This would be printed in every case.')

10.6处理多个异常

  可以使三种法来处理多个异常。

  ⽅法一:需要把所有可能发⽣的异常放到⼀个元组⾥。

 try:
file = open('test.txt', 'rb')
except (IOError, EOFError) as e:
print("An error occurred. {}".format(e.args[-1]))

  方法二:是对每个单独的异常在单独的except语句块中处理。我们想要多少个except语句块都可以。

 try:
file = open('test.txt', 'rb')
except EOFError as e:
print("An EOF error occurred.")
raise e
except IOError as e:
print("An error occurred.")
raise e

  上⾯这个⽅式中,如果异常没有被第⼀个except语句块处理,那么它也许被下⼀个语句块处理,或者根本不会被处理。

  方法三:会捕获所有异常:

 try:
file = open('test.txt', 'rb')
3 except Exception:
# 打印⼀些异常⽇志,如果你想要的话
raise

  当你不知道你的程序会抛出什么样的异常时,上⾯的⽅式可能⾮常有帮助。

10.7 存储数据

  使用json模块来存储数据。Json数据的格式并非python专用可以和用其他编程语言的人分享。是一种轻便格式,很有用,也易于学习。

  JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被用与众多语言。

  使用json.dump() 和json.load()来存储和载入数据。

  json.dump()接受两个实参,要存储的数据以及可用于存储数据的文件对象。

  1. 存储一组数字的程序 json.dump()
  2. 将数字读取到内存的程序 json.load()

10.7.2 保存和读取用户生成的数据

  json.dump和json.load结合使用,分别是存储和载入数据。

10.7.3 重构

  1.代码可以正确运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程叫重构。重构让代码更清晰,易于理解,更容易扩展。

  2.将大部分逻辑放到一个或多个函数内。

10.7.4 小结

  1.学习了读取文件,整个文件读取和一行读取,操作文件,打开,读取模式,写入模式,附加模式,读取加写入模式。

  2.异常处理try-except-else代码块的使用方法。异常类型。操作数据,保存和读取数据,json模块的使用,dump和load的使用,学会重构代码。

10.8调试

1.断言

  凡是用print()来辅助查看的地方,都可以用断言(assert)来替代。

 def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n def main():
foo('')

  assert的意思是,表达式n != 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错。

  如果断言失败,assert语句本身就会抛出AssertionError。

Python基础学习总结(八)的更多相关文章

  1. python基础学习(八)元组

    元组的定义 Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改 元组 表示多个元素组成的序列 元组 在 Python 开发中,有特定的应用场景 用于存储 一串 信息,数据 之间使用 , 分 ...

  2. python基础学习(八)

    17.嵌套循环 # 嵌套循环 nested loop # 在一个循环中使用另外一个循环 num_list1 = [1, 2, 3, 4] num_list2 = [6, 7, 8, 9] # 组合li ...

  3. Day1 Python基础学习

    一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...

  4. Day1 Python基础学习——概述、基本数据类型、流程控制

    一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...

  5. Python 基础学习 总结篇

    Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...

  6. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  7. (一)python基础学习

    根据廖雪峰老师的python教程写一些学习总结! Python基础学习 1.使用list和tuple (1)list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时 ...

  8. python基础学习(起步)

    目录 python基础学习(起步) 变量 常量 变量的内存管理 python垃圾回收机制 变量的其他赋值方式 今日编程小题 本人能力有限,若有偏颇之处请读者大大不吝赐教! 祝大家每天都在成长! pyt ...

  9. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

随机推荐

  1. Hibernate Update方法提交错误

    最近用通用Dao更新对象,报了以下错误 Row was updated or deleted by another transaction (or unsaved-value mapping was ...

  2. 关于C#低版本升级高版本时,项目中引用Microsoft.Office.Interop.Word,程序提示不存在类型或命名空间名office.

    Report.cs里using Microsoft.Office.Interop.Word;就会报错:编译器错误消息: CS0234: 命名空间“Microsoft.Office”中不存在类型或命名空 ...

  3. KVM虚拟机的日常管理与配置

    1. 查看KVM虚拟机配置文件及运行状态(1) KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/ autostart目录是配置kvm虚拟机开机自启动目录. (2) virsh命令帮 ...

  4. 卸载jdk1.7

    卸载jdk1.7: 1.开始->程序->控制面板 ->卸载程序->程序和功能 2.找到jdk的两个程序:java 7 update 45和java(TM)SE Developm ...

  5. scrapy 安装技巧

    手动安装twisted插件: 1.在http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted用Ctrl+F搜索twisted,下载对应版本. 2.用pip安 ...

  6. [Maven实战-许晓斌]-[第二章]-2.6 NetBeans上面安装Maven插件

    NetBeans上面安装Maven插件

  7. 【bzoj 3595】: [Scoi2014]方伯伯的Oj

    传送门&& 原题解 蒟蒻终于做到一道方伯伯的题了…… 调了一个上午一直TLE(发现自己打了好久的splay板子竟然是错的这种丢人事情我就不说了) 很明显,要建两棵树,$T1$维护排名, ...

  8. [AIR] 检测移动设备运动

    Accelerometer 类根据由设备的运动传感器检测的活动调度事件.此数据表示设备的位置或沿三维轴的移动.当设备移动时,传感器会检测到此移动并返回加速数据.Accelerometer 类提供了各种 ...

  9. 10分钟教你用Python实现微信自动回复

    01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...

  10. 对路径访问拒绝,要加上具体filename/c.png

    string strPath = Path.Combine(FilePath, DateTime.Now.ToString("yyyy-MM-dd")); if (!Directo ...