Python第十章文件和异常笔记
10.1从文件中读取数据
10.1.1读取整个文件
文件pi_digits.txt存储精确到30位的圆周率
3.1415926535 8979323846 2643383279
(1)采用函数open()打开文件,返回一个表示文件的对象
(2)关键词with在不再需要访问文件时将其关闭
(3)有了表示文件的对象后,使用方法read()读取文件内容,并将其作为一个长长的字符串存储在变量contents中
注:末尾输出是多了一行,是因为read()到达文件末尾返回一个空字符串,显示出来就是空行,可在输出时用方法rstrip()删除
>>> with open('pi_digits.txt') as file_object: contents = file_object.read() print(contents) 3.1415926535 8979323846 2643383279 >>>
10.1.2文件路径
(1)相对路径
让Python打开不与程序文件位于同一个目录中的文件, 需要提供文件路径 , 它让Python到系统的特定位置去查找,比如python_work文件夹有一个子文件text_files,而python_work所属的目录文件是找不到text_files的
在Linux和OSX中可以这样编写代码:
with open(‘text_files/filename.txt’) as file_object:
而在Windows中,在文件路径中使用反斜杠(\)而不是斜杠(/):
with open(‘text_files\filename.txt’) as file_object:
(2)绝对路径
若text_files不在python_work中,而在另一个文件夹other_files,则不能用相对路径,绝对路径通常比相对路径长,因此将其存储到一个变量当中,再将变量传递给open()
在Linux和OS X中, 绝对路径类似于下面这样:
file_path = ‘/home/ehmatthes/other_files/text_files/filename.txt’
with open(file_path) as file_object:
而在Windows中:
file_path = ‘C:\Users\ehmatthes\other_files\text_files\filename.txt’
with open(file_path) as file_object:
10.2.3逐行读取
(1)将要读取的文件名存储在变量中
(2)调用open
(3)for遍历文件每一行
filename = 'pi_digits.txt' with open(filename) as file_object: for line in file_object: print(line)
打印结果空白行变多:
每行末尾两个换行符:在文件中每行末尾都有换行符,print语句也会加上一个换行符,可在print语句中使用rstrip()
10.1.4创建一个包含文件隔行内容的列表
用方法readlines()从文件读取每行后将其存在列表中,
lines = file_object.readlines()
列表存储到变量中,在with代码块外用for循环打印变量中的各行
10.1.5使用文件内容
打开文件将所有行存在列表中
创建变量(一个空字符串):pi_string = ’ ’
用for循环将各行加入变量
filename = 'pi_digits.txt' with open(filename) as file_object: lines = file_object.readlines() pi_string = ' ' for line in lines: pi_string += line.strip()
注:
Python将所有文本解读为字符串,若读取数字,并将其作为数值使用,必须使用int()将其转换为整数,或使用float()转换为浮点数
10.1.6包含一百万位的大型文件
10.1.7判断文件中是否有某个特定值
判断由特定值组成的字符串是否在列表中可以用if
10.2写入文件
10.2.1写入空文件
在调用open时提供两个实参,第一个是要打开的文件的名字,第二个是告诉Python要以什么样的模式打开这个文件,模式有:
读取模式:‘r’
写入模式:‘w’
附加模式:‘a’
读取和写入文件模式:‘r+’
filename = 'programming.txt' with open(filename,'w') as file_object: file_object.write("I am learning English")
若写入的文件不存在,函数open() 将自动创建它。但以写入(‘w’ ) 模式打开文件时要注意, 因为如果指定的文件已经存在, Python将在返回文件对象前清空该文件。
注意 Python只能将字符串写入文本文件。 要将数值数据存储到文本文件中, 必须先使用函数str() 将其转换为字符串格式
10.2.2写入多行
函数write不会在写入的文本末尾添加换行符,因此如果要写入多行,要指定换行符
10.2.3附加到文件
若要给文件添加内容(不覆盖原有内容),可以用附加模式打开文件
Python不会在返回文件对象前清空文件, 而你写入到文件的行都将添加到文件末尾。 如果指定的文件不存在, Python将为你创建一个空文件。
10.3异常
10.3.1处理ZeroDivisionError 异常
print(5/0)
运行时会出现异常
print(5/0)ZeroDivisionError: division by zero
ZeroDivisionError是一个异常对象,这种情况下Python会停止运行,并指出引发了哪种异常
10.3.2使用try_except代码块
发生错误时可以编写一个try_except代码块来处理可能引发的异常
try: print(5/0)except ZeroDivisionError: print("You can't divide by zero!")
运行结果为:
You can't divide by zero!
如果try 代码块中的代码运行起来没有问题, Python将跳过except 代码块; 如果try 代码块中的代码导致了错误, Python将查找这样的except 代码块, 并运行其中的代码, 即其中指定的错误与引发的错误相同。在这个示例中, try 代码块中的代码引发了ZeroDivisionError 异常, 因此Python指出了该如何解决问题的except 代码块, 并运行其中的代码。
如果try-except 代码块后面还有其他代码, 程序将接着运行
10.3.3使用异常避免崩溃
创建一个只执行除法运算的简单计算器
print("Give me two numbers,and I'll divide them.") print("Enter 'q' to quit.") while True: first_number = input("\nFirst number: ") if first_number == 'q': break second_number = input("Second number: ") if second_number == 'q': break answer = int(first_number) / int(second_number) print(answer)
当输入的第二数为0时则出现崩溃
10.3.4 else代码块
print("Give me two numbers,and I'll divide them.") print("Enter 'q' to quit.") while True: first_number = input("\nFirst number: ") if first_number == 'q': break second_number = input("Second number: ") try: answer = int(first_number) / int(second_number) except ZeroDivisionError: print("You can't divide by 0!") else: print(answer)
如果try 代码块因除零错误而失败, 我们就打印一条友好的消息, 告诉用户如何避免这种错误。程序将继续运行, 用户根本看不到traceback,而如果除法运算成功就是用else代码块打印结果
10.3.5处理FileNotFoundError异常
若要读取一个不存在的文件的内容,则会出现异常
try代码块放在open()的代码块之前
10.3.6分析文本
方法split()是根据一个字符串创建一个单词列表
>>> title = "Alice in Wonderland" >>> title.split() ['Alice', 'in', 'Wonderland']
方法split() 以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中, 结果是一个包含字符串中所有单词的列表,虽然有些单词可能包含标点,接着可以用函数len确定多少个单词
10.3.7使用多个文件
可以先将程序的大部分代码移到一个名为count_words()函数中
def count_words(filename): '''计算一个文件大致包含多少个单词''' try: with open(filename) as file_object: contents = file_object.read() except FileNotFoundError: msg = "Sorry,the file " + filename + " does not exit." print(msg) else: #计算文件单词数 words = contents.split() num_words = len(words) print("The file " + filename + " has about " + str(num_words) + " words.") filename = 'guest.txt' count_words(filename)
使用多个文件时可以将要分析的文件名称存储在一个列表中,循环调用
10.3.8 异常时不表示继续运行
pass语句
def count_words(filename): '''计算一个文件大致包含多少个单词''' try: --snip-- except FileNotFoundError: pass else: --snip-- filename = 'guest.txt' count_words(filename)
pass 语句还充当了占位符, 它提醒你在程序的某个地方什么都没有做, 并且以后也许要在这里做些什么。 例如, 在这个程序中, 我们可能决定将找不到的文件的名称写入到文件missing_files.txt中。 用户看不到这个文件, 但我们可以读取这个文件, 进而处理所有文件找不到的问题。
10.3.9决定报告哪些错误
另:使用方法count() 来确定特定的单词或短语在字符串中出现了多少次
10.4存储数据
10.4.1使json.dump存储和json.load读取内存中的程序
1.函数json.dump需要两个形参,要存储的数据和可用于存储数据的文件对象
import json numbers = [2,3,4,5,7,11] filename = 'numbers.json' with open(filename,'w') as file_object: json.dump(numbers,file_object)
步骤:(1)导入模块
(2)指定要存储列表的文件名称,通常使用扩展名.json指出文件存储数据格式为JSON格式
(3)以写入模式打开文件,让json能够将数据写入其中
(4)使用函数json.dump()将列表存储到文件中
2.函数json.load()读取
import json filename = 'numbers.json' with open(filename) as file_object: numbers = json.load(file_object) print(numbers)
步骤 :(1)导入模块
(2)确保读取的是前面写入的文件
(3)以读取模式打开文件
(4)使用函数json.load()加载存储在文件中的信息,并将其存储在变量中
(5)打印
10.4.2保存和读取用户的数据
try-except-else
10.4.3重构
将代码划分为一系列完成具体工作的函数
import json def get_stored_username(): """如果存储了用户名,就获取它""" filename = 'username.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return username def get_new_username(): """提示用户输入用户名""" username = input("What is your name? ") filename = 'username.json' with open(filename,'w') as f_obj: json.dump(username,f_obj) return username def greet_user(): """问候用户,并指出其姓名""" username = get_stored_username() if username: print("Welcome back, " + username + "!") else: username = get_new_username() print("We'll remember you when you come back, " + username + "!") greet_user()
- 点赞
- 收藏
- 分享
- 文章举报
- 笔记:HeadFirstPython(3)文件与异常
- Python学习笔记 Day11 文件和异常
- [python自学笔记]匿名函数和文件处理、异常
- python学习第十章文件和异常部分课后练习自己尝试的代码
- Python学习笔记_Day10 文件和异常
- Python学习笔记10-文件和异常
- 《Head First Python》笔记 第三章 文件与异常
- Python的学习笔记——文件与异常
- Python基础笔记_Day13_Python文件读写IO、异常、自定义异常
- Python3.2官方文件翻译--课堂笔记和异常是阶级
- python 0基础学习笔记5:装饰器、偏函数、变量作用域、异常处理、文件读写
- Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
- Python学习笔记(五)异常处理与文件
- Head First Python学习笔记2——文件与异常
- Python学习笔记(9)-文件和异常
- Python学习笔记三(文件与异常)
- Python学习笔记06-类与文件和异常
- python基础学习笔记-文件与异常
- 阿齐兹的Python学习笔记——文件与异常
- python编程:从入门到实践 第十章 文件和异常