Python入门实例——文件和异常


文件操作

读取文件数据

通过使用 open() 函数打开文件进行文件操作,将文件中的信息读取到内存中。例如如下例子:

保存一个 pi_digits.txt 的文本文件,具体内容如下:

3.1415926535
8979323846
2643383279

创建一个如下内容的Python文件,命名为 file_reader.py ,代码内容如下:

with open("pi_digits.txt") as file_object:
	contents = file_object.read()
	print(contents)

运行结果如下:

在这里插入图片描述
如果担心结尾会有多余的回车,可以在打印时对内容进行去除尾部空白处理,使用 rstrip() 函数方式进行处理,修改后代码如下:

with open("pi_digits.txt") as file_object:
	contents = file_object.read()
	print(contents.rstrip())

按行读取文件数据,可以如下使用:

filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()
    
pi_string = ""

for line in lines:
    pi_string += line.strip()
    
print(pi_string)
print(len(pi_string))

执行结果如下:

在这里插入图片描述

简单实例——在圆周率中寻找你的生日

读取圆周率前一百万位,在其中判断是否包含你的生日,打印查找结果,具体代码如下:

filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()
    
pi_string = ""

for line in lines:
    pi_string += line.strip()
    
birthday = input("Enter your birthday, in the form mmddyy:")
if birthday in pi_string:
    print("Your birthday appears in the first million digits of pi!")
else:
    print("Your birthday does not in the first million digits of pi!")

运行结果如下:

在这里插入图片描述

写入文件数据

写入单行数据

保存数据最简单的方式就是将其写入文件中。通过将输出写入到文件中即可保证数据不会轻易丢失,并且在后续需要使用的时候还能通过读取文件再将数据读取到内容中继续进行处理。

要将文本写入到文件中,需要在调用 open() 函数时提供一个实参,以告诉Python需要写入打开的文件,例如下面的操作:

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

在上面的例子中,调用 open() 时提供了两个实参,第一个实参就是需要打开或者创建的文件的名称(包含绝对路径或者相对路径的名称);第二个实参( 'w' )表示将以写入模式打开这个文件。在打开文件时,可指定读取模式( 'r' )、写入模式( 'w' )、附加模式( 'a' )或可以读取和写入的模式( 'r+' )。如果省略了这个参数,那么Python将以默认的只读模式打开文件。

在使用 w 写入模式打开文件时,如果文件不存在将自动创建它。

写入多行数据

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")
    file_object.write("I love create new games.")

附加写入数据

采用 w 写入模式在打开文件时会将文件原有数据清空或者覆盖,如果只是希望在文件原有的内容后追加数据,需要使用 a 附加模式打开文件。当使用附加模式打开文件时,Python 不会再返回文件对象前情况文件,而后面写入的数据会添加到文件的末尾,如果指定的文件不存在也会自动进行创建。

具体示例代码如下:

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love create new games.\n")
    
with open(filename, 'a') as file_object:
    file_object.write("I also love finding meaning in large datasets.\n")
    file_object.write("I love creating apps that can run in a browser.\n")

最终写入 programming.txt 文件中的内容如下:

I love programming.
I love create new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.

异常

Python 使用被成为异常的特殊对象来管理程序执行期间发生的错误。每当发生让 Python 不知所措的错误时,它都会自动创建一个异常对象。如果恰好编写了处理该异常的代码,那么程序就会进行运行;而如果没有对异常进行处理,程序将停止并显示一个 traceback ,其中包含有关异常的报告。

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

具体事例如下:

  • 不使用 try-except 代码块处理的代码:
print(5/0)

在这里插入图片描述

  • 使用 try-except 处理后:
try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")

在这里插入图片描述

使用 try-except 进行异常处理

实例代码如下:

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("\nSecond number:")
    if second_number == 'q':
        break
    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print("You can't divide by 0!")
    else:
        print(answer)
        

在这里插入图片描述

使用多个文件实例

def count_words(filename):
    '''计算一个文件大概含有多少个单词'''
    try:
        with open(filename) as f_obj:
            contents = f_obj.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) + " word.")
        
filename = "alice1.txt"
count_words(filename)

执行结果如下:

在这里插入图片描述

JSON 模块存储数据

模块 JSON 能够将简单的 Python 数据结构转移存储到文件中,并在程序再次运行时加载此文件中的数据。使用 JSON 在 Python 程序之间分享数据很是方便。更重要的是, JSON 数据各式并不是 Python 专用的,所以使用 JSON 格式转储数据也同时可以与其他编程语言编写的程序进行交互使用。

使用 JSON

下面是使用 JSON 模块进行数据写入和数据读取的实例:

使用 json.dump() 进行数据存储:

import json

numbers = [2, 3, 5, 7, 11, 13]

filename = 'numbers.json'
with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj)

执行如下:

在这里插入图片描述

程序执行完成后,numbers.json 文件的内容如下:

在这里插入图片描述
使用 json.load() 进行数据读取:

import json

filename = 'numbers.json'

with open(filename) as f_obj:
    numbers = json.load(f_obj)
    
print(numbers)

执行结果如下:

在这里插入图片描述

保存、读取用户数据

以下实例中,程序将从 username.json 文件中获取用户数据并使用。

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 + "!")

执行结果如下:

在这里插入图片描述

并且,上面实例可以进行优化,具体优化后如下:

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()

执行结果如下:
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值