自学Python:第10篇——文件与异常

读取文件


读取整个文件

要以任何方式使用文件,都得先打开文件,这样才可以访问它
>>> with open('pi.txt') as file_object:
...     contents=file_object.read()
...     print(contents)
... 
3.1415926
  5358979
  3438462



关键字with在不再需要访问文件后将其关闭
你只管打开文件,并在需要的时候使用它,python会自动在合适的时候将其关闭

文件路径
分为相对路径和绝对路径
就目前而言,最简单的做法是,
要么将数据文件存储在程序文件所在的目录,
要么将其存储在程序文件所在目录的下一个文件夹中(个人推荐做法)


逐行读取
>>> with open('pi.txt') as file_object:
...     for line in file_object:
...         print(line)
... 
3.1415926

  5358979

  3438462


打印每一行时,发现空白行更多了,其中的一个换行符来自print语句


创建一个包含文件各行内容的列表
with open('pi.txt') as file_object:
    lines=file_object.readlines()
   
for line in lines:
    print(line.rstrip())

for line in lines:
    pi+=line.rstrip()

print(pi)
print(len(pi))
>>>
3.1415926  5358979  3438462
27



可见pi包含原来位于每行左边的空格,为了删除这些空格,可以用strip()替代rstrip()

for line in lines:
    pi+=line.strip()
>>>
3.141592653589793438462
23



注意:
读取文本文件时,python将其中的所有文本都解读为字符串。
如果你读取的是数字,并要将其作为数值使用,就必须使用函数int()/float()将其转换为整数/浮点数
如果要处理数字更大的文件,也可以创建一个包含所有这些数字的字符串,
只不过在打印的时候用切片只打印出一部分数字,以免终端显示全部数字而不断地翻滚
print(pi[:52]+'...')
这里,我们只打印到小数点后50位

圆周率中包含你的生日吗?
birthday=input()
if birthday in pi:
    print('YES!')
else:
    print('NO!')


3.14
>>>YES!

3.2
>>>NO!



写入文件
with open('pro.txt','w') as file_obj:
    file_obj.write("I love programming\n")

如果你要写入的文件不存在,函数open()会自动创建它

分析文本
方法split()以空格为分隔符将字符串拆分成多个部分
可用于计算一篇文章的单词数量
>>> name='torres sanz emmm'
>>> name.split()
['torres', 'sanz', 'emmm']
>>> len(name.split())
3



存储数据
用户关闭程序时,你几乎总是要保存他们提供的信息,一种简单的方法是:
使用模块json来存储数据
json.dump()
用于存储数据
>>> import json
>>> numbers=[1,2,3,45]
>>> with open('num.json','w') as f_obj:
...     json.dump(numbers,f_obj)


json.load()
用于读取数据
>>> with open('num.json') as f_obj:
...     x=json.load(f_obj)
... 
>>> x
[1, 2, 3, 45]

这是一种在程序之间共享数据的简单方式




异常
如果用户怀有恶意,他会通过traceback获悉你不希望他知道的信息
有事候,训练有素的攻击者可根据这些信息判断出可以对你的代码发起怎样的攻击
通过将可能引发错误的代码放在try-except代码块中,可以提高这个程序抵御错误的能力
依赖于try代码块执行成功的代码都应该放到else代码块中

处理ZeroDivisionError异常:
while True:
    num1=input("fisrt number:")
    num2=input("second number:")
    if num1=='q' or num2=='q':
        break
    try:
        ans=int(num1)/int(num2)
    except ZeroDivisionError:
        print("you can not divide by 0")
    else:
        print(ans)

>>>
fisrt number:0
second number:2
0.0
fisrt number:2
second number:0
you can not divide by 0



同理,可以处理FileNotFindError异常,解决找不到文件导致程序崩溃的问题
如果希望程序在发生异常时一身不吭,可以使用pass语句
eg:
except ZeroDivisionError:
    pass



重构
将代码划分为一系列完成具体工作的函数,这样的过程称为重构
每个函数都执行单一而清晰的任务




















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值