10.1 从文件中读取数据

10.1.1 读取整个文件

  1. with open('pi_digits.txt') as file_object:
  2. contents = file_object.read()
  3. print(contents)
  4. #注意这里如果故意在TXT文件末尾加了一个空行,如果想要删除空白,用print(contents.rstrip())
  5. >>>3.1415926
  6. 2200112
  7. 1234432

open() #打开文件的函数,参数为文件名称。在这个例子中,Python在当前执行的文件所在的目录中查找指定的文件。(相对路径)
关键字with # 在不再需要访问文件后将其关闭。让Python自己根据程序确定合适的时间关闭,避免人为使用close()过早或过晚关闭导致错误。
read() #读取文件的全部内容,并将内容作为一个长字符串存储在变量contents中。
(注意:如果文档末尾有空行,print时可以通过rstrip()来删除字符串后面的空白)

10.1.2 文件路径

  1. 1.相对路径:相对于当前运行程序所在的目录<br /> 2.绝对路径:文件在计算机中的准确位置(哪个磁盘,哪个文件夹……)<br /> Windows系统中文件路径采用反斜杠。 <br />

10.1.3 逐行读取

  1. filename = 'pi_digits.txt'
  2. with open(filename) as file_object:
  3. for line in file_object:
  4. print(line)
  5. #print语句本身含有一个换行符,而TXT文件每一行其实也有一个看不见的换行符
  6. #所以打印一条字符串后,相当于换了两次行。想要删除换行符,同样用rstrip()
  7. >>>3.1415926
  8. 2200112
  9. 1234432

注意:逐行读取时,TXT文件每一行其实都隐藏了一个换行符,而print语句本身也要换行,所以最后打印时每一行之间都有空行,除了最后一行,因为最后一行本身在TXT中就没有换行符。而要删除空白,用rstrip()删除字符串右侧的空白和换行符。(不只删除空白,还有换行符!!!))

10.1.4 创建一个包含文件各行内容的列表

  1. lines = file_object.readlines()
  1. 通过readlines(),读取文件的每一行并存储在一个列表中,再赋值给变量lines。<br /> 这样就可以再with代码块之外使用文件内容了。<br />

10.1.5-7 三个例子见书或pdf93

10.2 写入文件

10.2.1 写入空文件

  1. filename = 'programming.txt'
  2. with open(filename, 'w') as file_object:
  3. file_object.write("I love programming.")

open()中的第二个实参,是指以何种模式打开这个文件。
一共有4种模式,如果不指定,默认为读取模式:
读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)和既能读取也能写入的文件模式(‘r+’)

注意:
1.如果写入的文件不存在,即还未创建,函数open()将自动创建它;如果已经存在,且是写入模式,Python将再返回文件对向前清空该文件,使用时务必小心!!
2.Python只能将字符串写入TXT文件,如果要写入数据,必须先用str()转换为字符串类型)

10.2.2 写入多行

  1. filename = 'programming.txt'
  2. with open(filename, 'w') as file_object:
  3. file_object.write("I love programming.")
  4. file_object.write("I love creating new games.\n")
  5. #函数write()不会自动让文本换行,如果想换行得自己加换行符\n

函数write()不会自动让文本换行,即,多个write()并列,在TXT文件中仍然为一行。如果想换行得自己加换行符\n

10.2.3 附加到文件

  1. 如果想要给文件添加内容,而不是覆盖原有内容,可以用附加模式打开文件而不用写入模式。
  1. filename = 'programming.txt'
  2. with open(filename, 'a') as file_object: #附加模式,给文件添加内容,而不会覆盖原有内容
  3. file_object.write("I also love finding meaning in large datasets.\n")
  4. file_object.write("I love creating apps that can run in a browser.\n")

10.3 异常

每当程序出现错误时,Python都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行,而不会显示一个traceback(包含异常的报告)。

10.3.1 异常举例

  1. 由于除数不能为0,当程序中的除法计算除数为0时,将会产生一个异常对象ZeroDivisionError。<br />

10.3.2 使用try-except代码块

如果try中的代码出错,则会执行except中的代码

  1. try:
  2. print(5/0)
  3. except ZeroDivisionError:
  4. print("you can't divide by zero")

这样一来,当try中的代码出现异常时,Python将查找except代码块,并运行其中的代码。这样即使出现异常,用户也不会看到错误报告,而是看到一条提示。
如果在这之后还有其它代码,程序将继续运行。
当然,except后面也可以不写异常名,例子如下:
image.png

10.3.3 使用代码块避免崩溃

10.3.4else代码块

代码格式如下

  1. try:
  2. #可能出错的代码行
  3. except exception_name:
  4. #出现exception_name对应的异常的时候该怎么办
  5. else:
  6. #如果try中的那段代码在执行时没有出错,则执行else中的代码

10.3.5 处理FileNotFoundError异常

即文件名不存在。见书,给了个例子,让你了解异常怎么产生的。

10.3.6 分析文本

  1. split()

通过指定分隔符对字符串进行分割。并将分割后的结果存储到一个列表中,并返回这个列表
语法:str.split(str=””, num=string.count(str)) #最前面的str为等待分割的字符串,后面括号里的str为参数
实际上有两个参数str和num。str为指定的分隔符,默认为空字符,还包括空格、换行符、制表符等;num为分割次数。
eg.

words = contents.split() #将字符串contents进行分割,并将分割后得到的列表赋给变量words,之后可以用len()来计算contents有多少个单词
实例:
image.png
#计算文件中包含多少个单词(由于之前write()的时候,前两行中间没有换行符,也没有留空格,所以第三个元素:programming和I连在一起了,实际有26个单词)

10.3.7 分析多个文本

(加了个for遍历而已)

10.3.8 忽略掉出现的异常

  1. pass语句:放在except中,当发现异常时,不告诉用户,继续执行接下来的代码
  1. filename = 'programminga.txt'
  2. #这里在刚才的文件名后加了个a,其实这个文件不存在,但由于except中用了pass语句
  3. #所以执行程序时用户不会得知出现了异常(既没有结果,也不显示异常)
  4. try:
  5. with open(filename, 'r') as file_object:
  6. contents = file_object.read()
  7. except FileNotFoundError:
  8. pass
  9. else:
  10. words = contents.split()
  11. number = len(words)
  12. print(number)

10.4 存储数据

模块json能够将简单的Python数据结构存储到文件中,并在程序再次运行时加载该文件。

10.4.1 使用json.dump()和json.load()

1. 函数json.dump():

可以接受两个实参,第一个位置是要存储的数据;第二个位置是用于存储这一数据的文件对象。

  1. import json
  2. numbers = [2, 3, 5, 7, 11, 13]
  3. filename = 'numbers.json'
  4. with open(filename, 'w') as f_obj:
  5. json.dump(numbers, f_obj)

2. 函数json.load():

有一个实参,是要加载的文件对象

  1. import json
  2. filename = 'numbers.json'
  3. with open(filename) as f_obj:
  4. numbers = json.load(f_obj)
  5. #这样就把.json中的数据加载到了内存中,赋值给变量numbers,我们就能在程序中对这个数据进行操作了
  6. print(numbers)

10.4.3 重构

  1. 将一大段代码划分为一系列完成具体工作的函数,这样的过程称为重构。<br /> 重构使得代码更加清晰,更易于理解和扩展。