开发者社区> 跑不了的你> 正文

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

简介: Python入门实例——文件和异常
+关注继续查看

文章目录

文件操作

读取文件数据

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

写入文件数据

写入单行数据

写入多行数据

附加写入数据

异常

使用 `try-except` 进行异常处理

使用多个文件实例

JSON 模块存储数据

使用 JSON

保存、读取用户数据


文件操作

读取文件数据

通过使用 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)


运行结果如下:

20200618220052928.png


如果担心结尾会有多余的回车,可以在打印时对内容进行去除尾部空白处理,使用 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))


执行结果如下:

2020061822084979.png


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

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


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


运行结果如下:

20200618221612171.png

写入文件数据

写入单行数据

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


要将文本写入到文件中,需要在调用 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)

20200618223929759.png

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

20200618224039490.png

使用 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)

20200618224724481.png

使用多个文件实例

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)


执行结果如下:

2020062115205554.png

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)


执行如下:

20200621154252687.png

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

20200621154346889.png

使用 json.load() 进行数据读取:


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


执行结果如下:

20200621154649792.png

保存、读取用户数据

以下实例中,程序将从 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 + "!")


执行结果如下:

20200621161311979.png

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


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


执行结果如下:

20200621162419337.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python 实例解析--村长选举
python 实例解析--村长选举
16 0
Python异常机制2:正确的使用姿势和实例
Python异常机制2:正确的使用姿势和实例
11 0
Python 彻底搞懂列表推导式|初级到进阶(实例30+)
Python 彻底搞懂列表推导式|初级到进阶(实例30+)
20 0
浅析算法的时间复杂度和空间复杂度 (C++/python双语实例)
浅析算法的时间复杂度和空间复杂度 (C++/python双语实例)
30 0
Python 用os和win32api库模仿DOS命令dir (完整实例)
Python 用os和win32api库模仿DOS命令dir (完整实例)
19 0
Python tkinter库Canvas操作(附涂鸦、颜色表、围棋盘三个实例)
Python tkinter库Canvas操作(附涂鸦、颜色表、围棋盘三个实例)
18 0
Python动物图像分割API简单调用实例演示,阿里达摩院视觉智能开放平台使用步骤
图像分割的目标是将图像中的像素分成不同的组或区域,使具有相似特征的像素属于同一组,从而实现目标对象的提取。常见的图像分割方法之一是语义分割(Semantic Segmentation)。 语义分割通过深度学习模型,如卷积神经网络(CNN),学习图像的特征表示,并生成像素级的分割结果。通常,语义分割使用全卷积网络(FCN)或其改进版本作为网络结构。编码器用于提取图像的特征表示,而解码器通过上采样操作将特征图还原到原始图像的尺寸,并生成分割结果。
36 0
Python正则表达式匹配电话号码和邮箱实例演示,正则表达式的基本用法
Python正则表达式匹配电话号码和邮箱实例演示,正则表达式的基本用法
29 0
Python图像卡通化animegan2-pytorch实例演示
Python图像卡通化animegan2-pytorch实例演示
27 0
Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理
Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理
26 0
+关注
跑不了的你
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
双剑合璧-Python和大数据计算平台的结合
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多