Python基础学习09天
主要内容:
文件处理相关,读取文件和写入文件等。
异常处理和捕获异常。
文件和异常处理
从文件中读取数据
要使用文本文件中的信息,首先需要将信息读取到内存中。为此,我们可以一次性读取文件的 全部内容,也可以以每次一行的方式逐步读取。
读取整个文件
要读取文件,需要一个包含几行文本的文件。新建一个圆周率后30位的文件为例,保存为pi_digits.txt
,同时小数点后是为换行。如下:
3.1415926535
8979323846
2643383279
读取该文件的Python
文件,file_reader.py
。代码如下:
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(rstrip(contents))
open()
函数是任何方式使用文件,哪怕仅仅是打印其内容,都得先打开文件。它接受一个参数: 要打开的文件的名称。Python
在当前执行的文件所在的目录中查找指定的文件。
close()函数是关闭文件。
关键字with
在不再需要访问文件后将其关闭。Python
方法rstrip()
删除字符串末尾的空白。
运行结果:
3.1415926535
8979323846
2643383279
文件路径
当你将类似pi_digits.txt
这样的简单文件名传递给函数open()
时,Python
将在当前执行的文件 (即.py
程序文件)所在的目录中查找文件。
语法格式:
1 |
with open('text_files/filename.txt') as file_object: |
---|
通过使用绝对路径,可读取系统任何地方的文件。注意区分相对路径和绝对路径。
逐行读取
读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以 某种方式修改文件中的文本。逐行读取可以理解为遍历、循环等逻辑。所以在读取文件时,可以采用for
语句来实现。代码示例:
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
创建一个包含文件各行内容的列表
使用关键字with
时,open()
返回的文件对象只在with
代码块内可用。如果要在with
代码块外 访问文件的内容,可在with
代码块内将文件的各行存储在一个列表中,并在with
代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()#从文件中读取每一行,并将其存储在一个列表中
#使用一个简单 的for循环来打印lines中的各行
for line in lines:
print(line.rstrip())
使用文件的内容
将文件读取到内存中后,就可以以任何方式使用这些数据了。
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()#从文件中读取每一行,并将其存储在一个列表中
pi_string = '' #创建一个变量存贮圆周率的值
for line in lines: #使用一个循环将各行都加入pi_string,并删除每行末尾的换行符
pi_string += line.strip()
print(pi_string) #打印这个字符串
print(len(pi_string)) # 长度
读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并 要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转 换为浮点数。
包含一百万位的大型文件
对于你可处理的数据量,Python
没有任何限制;只要系统的内存足够多,想处理多少数据都可以。
写入文件
保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。
写入空文件
要将文本写入文件,你在调用open()
时需要提供另一个实参,告诉Python
你要写入打开的文件。
代码示例:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
打开文件时,可指定读取模 式('r')
、写入模式('w')
、附加模式('a')
或让你能够读取和写入文件的模式('r+')
。如果 你省略了模式实参,Python
将以默认的只读模式打开文件。
以写入(‘w’)模式打开文件时,如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
Python
只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()
将其转换为字符串格式。
写入多行
函数write()
不会在你写入的文本末尾添加换行符,如果需要写入多行就需要在每行的后面添加换行符:n
。
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
file_object.write("I love Python.")
输入结果:
1 |
I love programming.I love Python. |
---|
附加到文件
附加到文件可以理解为不清空当前的文件内容,在文件内容后面追加即可。如果以附加的形式打开,如果文件不存在就会被创建。具体实现只需要在使用open()
函数的时候指定打开方式为a
即可,其余类似。
异常
Python
使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python
不知 所措的错误时,它都会创建一个异常对象。
异常是使用try-except
代码块处理的。try-except
代码块让Python
执行指定的操作,同时告诉Python
发生异常时怎么办。使用了try-except
代码块时,即便出现异常,程序也将继续运行: 显示你编写的友好的错误消息,而不是令用户迷惑的traceback
。
处理ZeroDivisionError
异常
例如我们让Python
运行8/0
的代码报错信息。
>>> 7/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
此时程序停止运行。
使用try-except
代码块
try:
print(7/0)
except ZeroDivisionError:
print("You can't divide by zero!")
# 其他的代码块将继续运行
使用异常避免崩溃
发生错误时,如果程序还有工作没有完成,妥善地处理错误就尤其重要。这种情况经常会出 现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。
else
代码块
try-except-else
代码块的工作原理:Python
尝试执行try
代码块中的代码;只有可 能引发异常的代码才需要放在try
语句中。
代码示例:
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
处理FileNotFoundError
异常
产生的背景:要查找的文件可能在其他地方、文件名可能 不正确或者这个文件根本就不存在。机会产生FileNotFoundError
异常。同理可以给用户一个友好的消息提示。
拆分字符串
方法split()
以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
代码示例:
>>> title = "Alice in Wonderland"
>>> title.split()
['Alice', 'in', 'Wonderland']
使用多个文件
使用多个文件和单个文件逻辑一致,只不过把逻辑处理部分封装为方法,多个文件就循环处理即可。
def count_words(filename):
#计算一个文件大致包含多少个单词
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
# 计算文件大致包含多少个单词
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) +
" words.")
filename = 'alice.txt'
count_words(filename)
存储数据
模块json
让你能够将简单的Python
数据结构转储到文件中,并在程序再次运行时加载该文件 中的数据。你还可以使用json
在Python
程序之间分享数据。更重要的是,JSON
数据格式并非Python
专用的,这让你能够将以JSON
格式存储的数据与使用其他编程语言的人分享。
使用json.dump()
和json.load()
函数json.dump()
接受两个实参:要存储的数据以及可用于存储数据的文件对象。
编写一个存储一组数字的简短程序,再编写一个将这些数字读取到内存中的程序 (json.load()
)。
代码示例:
import json
num = [1,2,3,4,5,6]
filename = 'num.json'
with open(filename,'w') as f_obj:
json.dump(num,f_obj)#写入文件
num = json.load(f_obj) #读到内存,可以打印
print(num)
运行后文件的内容和打印的内容一致。
1 |
[1, 2, 3, 4, 5, 6] |
---|
保存和读取用户生成的数据
用户输入的信息我们可以通过写入文件的方式写在文件内,再次输入的时候可以打开文件查询判断是否存在。其实就是把写入和读取文件两个逻辑合成一个。
代码如下:
import json
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
username = input("What is your name? ")
with open(filename, 'w') as f_obj:
json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!")
else:
print("Welcome back, " + username + "!")
- hdu----(4686)Arc of Dream(矩阵快速幂)
- HDU----(4549)M斐波那契数列(小费马引理+快速矩阵幂)
- Centos系统修改时区
- zookeeper思考与总结1:在其它组件的作用及hdfs对比
- HDU----(4291)A Short problem(快速矩阵幂)
- Linux下删除指定文件之外的其他文件
- HDU----(2157)How many ways??(快速矩阵幂)
- 试试Linux下的ip命令
- hdu---(2604)Queuing(矩阵快速幂)
- centos7下卸载python后yum不能使用的恢复方法
- hdu---(5038)Grade(胡搞)
- shell生成随机字符的几种方法
- Python时间获取及转换
- spark streaming知识总结[优化]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java面试题汇总-基础篇
- SpringMVC全局异常处理机制
- centos su sudo wheel
- List集合的坑
- NIO从入门到踹门
- GitHub CLI 1.0.0 正式发布!
- 【Flink】从零搭建实时数据分析系统
- Android模拟面试,解锁大厂——从Activity创建到View呈现中间发生了什么?
- 问你一个简单的问题:IP是怎么来的,又是怎么没的?
- 进击的NIO!Reactor模式!
- 交换机与VLAN:以办公室为例趣讲一波!
- 超详细Netty入门,看这篇就够了!
- Netty进阶之粘包和拆包问题
- 用侦察兵的故事趣讲ICMP和Ping,看完想忘都难!
- Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储