python学习10

文件与异常

练习

'''
在文本编辑器中新建一个文件,写几句话来总结一下你至
此学到的Python 知识,其中每一行都以“In Python you can”打头。将这个文件命名为
learning_python.txt,并将其存储到为完成本章练习而编写的程序所在的目录中。编写一
个程序,它读取这个文件,并将你所写的内容打印三次:第一次打印时读取整个文件;
第二次打印时遍历文件对象;第三次打印时将各行存储在一个列表中,再在with 代码
块外打印它们。
'''
filename='learning_python.txt'                            #将文件名用变量表示,就是为了方便
with open(filename) as new_file:                          #打开文件并并赋予对象
    contents=new_file.read()                              #读取文件的内容赋值给contents
    print(contents)                                       #打印文件内容
    new_file.seek(0)                                      #回到文件开头
    for line in new_file:                                 #遍历文件
        print(line.rstrip())                              #输出,
    new_file.seek(0)                                      #回到文件开头
    lines=new_file.readlines()                            #将文件逐行存到列表中
for line in lines:                                        #遍历列表
    print(line.strip())                                   #输出 

虽然是段短小的程序,但包含的内容还是比较多的。关键字with是用于文件在不需要使用时关闭的,所以最后也不要用close来关闭文件了。read是读取文件的内容,如果没有参数,就读取文件所有内容。下面重要内容来了,因为执行了read语句,所以现在指向文件的指针已经到了文件最后,下面再对文件做操作,就找不到内容了。所以需要用到seek这个方法,seek是用于指向文件的指针移到指定的位置,一会下面会用代码证明下

#test
#测试文件
filename='learning_python.txt'
with open(filename) as new_file:
    contents=new_file.read()
    print(contents)
    print('\n\n')
    for line in new_file:
        print(line)
    print('上面有内容输出吗?')
    print('明显没有')
    new_file.seek(10)                                   #指针指向第10个字符,再次使用文件就从第11个字符开始     
    for line in new_file:
        print(line.rstrip())
In Python you can bbbbbb
In Python you can adfafdcda
In Python you can fsafdsfsa



上面有内容输出吗?
明显没有
you can bbbbbb
In Python you can adfafdcda
In Python you can fsafdsfsa
'''
可使用方法replace()将字符串中的特定单词都替换为另一个单词
读取你刚创建的文件learning_python.txt 中的每一行,将其中的Python 都替换为另
一门语言的名称,如C。将修改后的各行都打印到屏幕上。
'''
file_name='learning_python.txt'
with open(file_name) as file_replace:
    for line in file_replace:
        print(line.rstrip().replace('Python','C++'))

之前的例子都是读取文件,因为open函数都是默认参数的,如果需要写入文件,就需要用到其他参数了

r             #读取模式
w             #写入模式
a             #附加模式
r+            #读写模式
open(文件名,‘模式’)
要注意的是写入模式,如果文件不存在,会新建一个新文件,如果文件存在的话,你再写入,会将原来的内容覆盖掉,要谨慎。如果需要在已存在文件里添加内容的话,可以使用附加模式‘a’,如果文件不存在,也是能新建文件的,另外写入内容时是不会自动换行的,所以要合理运用换行符。

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

小练习 

'''
访客:编写一个程序,提示用户输入其名字;用户作出响应后,将其名字写入到文件guest.txt 中。
'''
name=input("请输入名字")
filename='guest'
with open(filename,'a') as new_file:
    new_file.write(name)
'''
访客名单:编写一个while 循环,提示用户输入其名字。用户输入其名字后,
在屏幕上打印一句问候语,并将一条访问记录添加到文件guest_book.txt 中。确保这个
文件中的每条记录都独占一行
'''
name=input("请输入名字:")
while name!='':                                                     #无输入时结束循环
    
    filename='guest_book.txt'
    with open(filename,'a') as new_file:
        print('welcome '+name)
        new_file.write(name+'\n')
    name=input("请输入名字:")

异常

很多程序运行突然崩溃,就是代码运行发生了错误,这样的程序就很不友好。为了规避这种情况,使程序在发生错误后继续运行下支而不是崩溃,就引入了异常这个对象

异常是使用try-except代码块处理的。try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback

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

    
You can't divide by zero!                                #友好的错误提示
>>> 

如果在代码块后面还有代码,会继续运行

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
    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print("除数不能为0")
    else:
        print(answer)

一开始没有加异常模块时,如果second_number输入为0,会直接报错且程序退出执行。在加入了异常模块后,就不用担心程序崩溃了,else语句是在不触发异常时执行的语句

filename = 'alice.txt'
try:
    with open(filename) as f_obj:
        contents = f_obj.read()
except FileNotFoundError:                                       #如果不存在这个文件,就会报异常且不会执行else语句
    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.")
for word in words:
    print (word)

如果需要分析多个文件,可以将上面的代码编成函数再调用就可以了。如果在出现异常时不需要提示,可以用pass

小练习:

'''加法运算:提示用户提供数值输入时,常出现的一个问题是,用户提供的是
文本而不是数字。在这种情况下,当你尝试将输入转换为整数时,将引发TypeError 异
常。编写一个程序,提示用户输入两个数字,再将它们相加并打印结果。在用户输入的
任何一个值不是数字时都捕获TypeError 异常,并打印一条友好的错误消息。对你编写
的程序进行测试:先输入两个数字,再输入一些文本而不是数字'''
num_1=input("请输入第一个数字")
num_2=input("请输入第一个数字")
try:
    num=int(num_1)+int(num_2)
except ValueError:
    print("你输入的不是数字")
else:
    print(num)
================== RESTART: C:\Users\Deast\Desktop\test.py ==================
请输入第一个数字44
请输入第一个数字rf
你输入的不是数字
>>> 
================== RESTART: C:\Users\Deast\Desktop\test.py ==================
>>> 
请输入第一个数字35
请输入第一个数字24
59
>>> 
'''加法计算器:将你为完成练习10-6 而编写的代码放在一个while 循环中,让
用户犯错(输入的是文本而不是数字)后能够继续输入数字'''
while True:
    num_1=input("请输入第一个数字")
    if num_1=='q':
        break
    num_2=input("请输入第一个数字")
    if num_2=='q':
        break
    try:
        num=int(num_1)+int(num_2)
    except ValueError:
        print("你输入的不是数字")
    else:
        print(num)

请输入第一个数字32
请输入第一个数字df
你输入的不是数字
请输入第一个数字54
请输入第一个数字21
75
请输入第一个数字q
>>> 
存储数据

模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。而且json文件在其他编程也可以使用。

import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj)
with open(filename) as f_obj:
    numbers_=json.load( f_obj)
print(numbers_)
小练习

'''喜欢的数字:编写一个程序,提示用户输入他喜欢的数字,并使用
json.dump()将这个数字存储到文件中。再编写一个程序,从文件中读取这个值,并打
印消息“I know your favorite number! It’s _____.”。
'''
import json
filename='numbers.json'
with open(filename,'w') as file:
    while True:
        
        try:
            numbers_input=int(input('输入你喜欢的数字:'))
        except ValueError:
            print('你输入的不是数字')
        else:
            json.dump(numbers_input,file)
            break
with open(filename) as file:
    numbers_output=json.load(file)
    print("I know your favorite number! It’s " +str(numbers_output))
'''记住喜欢的数字:将练习10-11 中的两个程序合而为一。如果存储了用户喜
欢的数字,就向用户显示它,否则提示用户输入他喜欢的数字并将其存储到文件中。运
行这个程序两次,看看它是否像预期的那样工作'''
import json
filename='numbers.json'
try:
    with open(filename) as file:
        numbers_output=json.load(file)
except FileNotFoundError:
    with open(filename,'w') as file:
        while True:
            try:
                numbers_input=int(input('输入你喜欢的数字:'))
            except ValueError:
                print('你输入的不是数字')
            else:
                json.dump(numbers_input,file)
                print("你喜欢的数字已存")
                break
else:
    print("I know your favorite number! It’s " +str(numbers_output))



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值