Python 点滴积累(10)

Python 文件和异常

从文件中读取数据

1.读取整个文件
with open('data.txt') as file_object:
    contents=file_object.read()
    print(contents)

程序输出:

1.2340
2.3450
3.4560
4.5670
5.6780

函数**open()**接收一个参数:要打开的文件名称。Python会在当前执行的文件所在的目录中查找指定的文件。函数open()返回一个表示文件的对象。Python将这个对象存储在我们将在后面使用的变量中。

关键字with在不再访问文件后将其关闭。你也可以使用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭。

相比于原始文件,该输出唯一不同的是末尾多了一个空行。这是因为read()到达文件末尾时返回一个空字符串,而将这个空字符显示出来就是一个空行。要删除多出来的空行,可在print语句中使用rstrip()。

要让Python打开不与程序文件位于同一个目录中的文件,需要提供文件路径。在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/)。

2.逐行读取
with open('data.txt') as file_object:
    for line in file_object:
        print(line)

程序输出:

1.2340

2.3450

3.4560

4.5670

5.6780

要以每一行的方式读取文件,可对文件对象使用for循环。但是输出结果中,发现空白行明显变多了。这是因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句。要消除这些多余的空白行,可在print语句中使用rstrip()。

3.使用文件内容

使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。

with open('data.txt') as file_object:
    lines=file_object.readlines()
for line in lines:
    print(line.rstrip())
print(len(lines))
print(float(lines[0])+100)

程序输出:

1.2340
2.3450
3.4560
4.5670
5.6780
5
101.234

readlines()从文件中读取一行,并将其存储在一个列表中。
读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读去的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转换为浮点数。

4.写入文件

open()可以提供两个实参,第一个实参是打开的文件名称,第二个实参,可以指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或能够读取和写入文件的模式(‘r+’)。如果省略了模式实参,Python将以默认的只读模式打开文件。

如果要写入的文件不存在,函数open()将自动创建它。然而,以写入(‘w’)文件模式打开文件时,如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。

filename="data.txt"
with open(filename,'w') as file_object:
    file_object.write("I love Python.\n")
    file_object.write("Python is great.\n")

程序输出:

I love Python.
Python is great.

异常

Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。异常是使用try-except代码块处理的。

print(5/0)

程序输出:

ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-42-fad870a50e27> in <module>()
----> 1 print(5/0)

ZeroDivisionError: division by zero

在上述traceback中,ZeroDivisionError是一个异常对象。

try:
    print(5/0)
    print(6/3)
except ZeroDivisionError:
    print("You can't divide by zero")

程序输出:

You can't divide by zero

如果发生异常后,不需要提示用户信息,可以在except中使用pass语句。

编写的很好的且经过详尽测试的代码不容易出现内部错误,如语法或逻辑错误,但只要程序依赖于外部因素,如用户输入、存在指定文件、有网络连接、就有可能出现异常。凭借经验可判断该在程序什么地方包含异常处理块,以及出现错误时该向用户提供多少相关的信息。

存储数据

使用模块Json来存储数据,模块Json能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
json.dump()
json.load()

import json
filename='username.json'
try:
    with open(filename) as f_obj:
        username=json.load(f_obj)
except:
    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 call back, "+username+" .")
else:
    print("Welcome back, "+username+" !")

程序输出:

What is your name?Jack
We'll remember you when you call back, Jack .

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值