python-文件和异常

news2024/9/26 5:24:28

1. 从文件中读取数据

1.1. 读取整个文件

  • 在同目录下创建textA文本文件

123
456
789

a. open函数:要以任何方式去使用文件,都需要先打开文件,它接受一个参数——要打开文件的名称。 open()返回一个表示文件的对象。

b. 关键字with在不再需要访问文件后将其关闭。

c. 使用read()方法可以读取文件中的内容,并将其作为一个长字符串存储在变量中。read()到达文件末尾时返回一个空字符串。

with open('textA') as text:
    contents = text.read()
    print(contents)

# 123
# 456
# 789

1.1.1 文件路径

  • 使用相对路径

with open('text/textA') as text:
    contents = text.read()
    print(contents)

# 123
# 456
# 789
  • 使用绝对路径

file_path = 'D:\Code\\text\\textA'
with open(file_path) as obj:
    contents = obj.read()
    print(contents.rstrip())

# 123
# 456
# 789

1.1.2 逐行读取

file_path = 'D:\Code\\text\\textA'
with open(file_path) as obj:
    for line in obj:
        print(line.rstrip())

# 123
# 456
# 789

1.1.3 创建一个包含文件各行内容的列表

注意:使用方法readlines,从文件中读取每一行,将其存储在一个列表中。

file_path = 'D:\Code\\text\\textA'
with open(file_path) as obj:
    list = obj.readlines()
for line in list:
    print(line.rstrip())
print(list)
# 123
# 456
# 789
# ['123\n', '456\n', '789']

1.2. 使用文件的内容

file_path = 'D:\Code\\text\\textA'
with open(file_path) as file:
    file_list = file.readlines()
str = ''
for line in file_list:
    str += line.rstrip()
print(str)
print(len(str))
# 123456789
# 9

1.2.1 使用replace修改文件中的内容

  • textA

I like cat!
The cat is very cute!
  • hello_world.py

file_path = 'D:\Code\\text\\textA'
with open(file_path) as file:
    contents = file.read()
print(contents.replace('cat', 'dog'))
# I like dog!
# The dog is very cute!

2. 写入文件

注意:

  • open函数可接受两个实参,一个是要打开文件的名称,另一个是以什么样的模式打开这个文件。其中,模式有:r(读取模式)、w(写入模式)、a(附加模式)、r+(能够读取和写入文件的模式)。如果省略模式实参,将默认以只读模式打开文件。

  • 如果写入的文件不存在,则open函数将创建这个文件;如果写入的文件是存在的,则python在返回文件对象前会清空该文件。

  • 文件对象的方法——write,用于将字符串写入文件。

file_name = 'D:\Code\\text\\textA'
with open(file_name, 'w') as file_object:
    file_object.write('I love python!')

2.1. 写入多行

注意:加换行符

file_name = 'D:\Code\\text\\textA'
with open(file_name, 'w') as file_object:
    file_object.write('I love python!\nFighting!')

2.2. 附加到文件

注意:

  • 若要给文件添加内容,而不是覆盖原有的内容,则可用附加模式a打开文件。

  • 若指定的文件不存在,则会创建一个空文件。

  • 该方法添加的内容都在文件末尾。

hello_world.py

file_name = 'D:\Code\\text\\textA'
with open(file_name, 'a') as file_object:
    file_object.write('come on\n')
    file_object.write('If you can, you can.')

textA

I love python!
Fighting!
come on
If you can, you can.

2.3. 习题

1.访客:编写一个程序,提示用户输入其名字;用户作出响应后,将其名字写入到文件guest中。

  • hello_world.py

username = input('Please input your name: ')
file_name = 'D:\Code\\text\\guest'
with open(file_name, 'a') as file_object:
    file_object.write(username.title() + '\n')
  • guest

Ann
Bob

2.访客名单:编写一个while循环,提示用户输入其名字。用户输入其名字后,在屏幕上打印一句问候语,并将一条访问记录添加到文件guest_book中。确保这个文件中的每条记录都独占一行。

hello_world.py

file_name = 'D:\Code\\text\guest'

def write_fun(str, file_name):
    with open(file_name, 'a') as file_object:
        file_object.write(str + '\n')

while True:
    username = input('Please input your name: ')
    str = 'Hello,' + username.title()
    print(str)
    write_fun(str, file_name)

# Please input your name: tom
# Hello,Tom
# Please input your name: bob
# Hello,Bob
# Please input your name:

guest

Hello,Tom
Hello,Bob

3. 异常

Python使用称为异常的特殊对象来去处理程序执行期间发生的错误。当发生让Python不知所措的错误时,会创建一个异常对象。如果你编写了处理异常的代码,则程序继续运行;若没有对异常进行处理,则程序停止,并显示traceback,里面包含有关异常的报告。

3.1. 处理ZeroDivisionError异常

print(2/0)

显示:

Traceback (most recent call last):
  File "D:\Code\hello_world.py", line 1, in <module>
    print(2/0)
ZeroDivisionError: division by zero

注意:这里的ZeroDivisionError是一个异常对象,我们可以根据这种信息对程序进行修改,告诉Python发生错误时,该怎么处理。

3.1.1 使用try-except代码块

注意:

  • 若try代码块中的代码执行起来没有问题,则跳过except代码块

  • 若try代码块中代码执行起来有问题,则运行except中的代码块

  • 若try-except代码块后面还有代码,则将继续执行下去

try:
    print(2 / 0)
except ZeroDivisionError:
    print("you can't divide by zero!")
# you can't divide by zero!

3.2. try-except-else代码块

工作原理:

  • try:将可能引发异常的代码放入try代码块中

  • else:存放仅在try代码块成功执行时才需要运行的代码

  • except:处理引发指定的异常时的情况

print("Enter 'q' to quit.")
while True:
    a = input('Please input a number: ')
    if a == 'q':
        break
    b = input('Please input a number: ')
    if b == 'q':
        break
    try:
        result = int(a) / int(b)
    except ZeroDivisionError:
        print("You can't divide by zero!")
    else:
        print(result)

# Enter 'q' to quit.
# Please input a number: 5
# Please input a number: 0
# You can't divide by zero!
# Please input a number: 8
# Please input a number: 4
# 2.0
# Please input a number: q

3.3. 处理FileNotFoundError异常

示例:不存在a这个文件

file_name = 'a.txt'
try:
    with open(file_name) as file_obj:
        contents = file_obj.read()
except FileNotFoundError:
    print(file_name + ' is not exist!')
else:
    print(contents)
# a.txt is not exist!

3.3.1 分析文本

注意:split方法可将字符串生成列表

a

Tom is my best friend, and I like him.

hello_world.py

file_name = 'D:\Code\lx\\a'
try:
    with open(file_name) as file_obj:
        contents = file_obj.read()
except FileNotFoundError:
    print(file_name + ' is not exist!')
else:
    words = contents.split()
    print(len(words))
# 9

3.3.2 使用多个文件

a

Tom is my best friend, and I like him.

b

Jerry is my best friend.

hello_world.py

def count_word(file_name):
    '''文件单词数量'''
    try:
        with open(file_name) as file_obj:
            contents = file_obj.read()
    except FileNotFoundError:
        print(file_name + ' is not exist!')
    else:
        words = contents.split()
        print(len(words))

file_list = ['D:\Code\lx\\a', 'D:\Code\lx\\b', 'D:\Code\lx\\c']
for file in file_list:
    count_word(file)
# 9
# 5
# D:\Code\lx\c is not exist!

3.3.3 失败时不做处理

注意:使用pass语句,可以让Python什么都不做。

def count_word(file_name):
    '''文件单词数量'''
    try:
        with open(file_name) as file_obj:
            contents = file_obj.read()
    except FileNotFoundError:
        pass
    else:
        words = contents.split()
        print(len(words))


file_list = ['D:\Code\lx\\a', 'D:\Code\lx\\b', 'D:\Code\lx\\c']
for file in file_list:
    count_word(file)
# 9
# 5

3.4. 补充count方法

注意:count方法用来确定特定的单词或短语在字符串中出现了多少次

str = 'dog dog dog cat cat dogdog'
print(str.count('dog'))
# 5

4. 存储数据

可以使用模块json来存储数据,以JSON格式存储的数据也可以与使用其他编程语言的人分享

4.1. 使用json.dump()和json.load()

  • json.dump用来存储数据,json.load将数据读取到内存中的程序,使用时需先导入json模块

  • json.dump(要存储的数据,可用于存储数据的文件对象)

  • 使用文件扩展名.json指出文件存储的数据为JSON格式

1.使用json.dump将数字列表存储到文件number_list.json中

hello_world.py

import json

numbers = [1, 2, 3]
with open('number_list.json', 'w') as file_obj:
    json.dump(numbers, file_obj)

number_list.json

[1, 2, 3]

2.使用json.load将列表读取到内存中

import json

with open('number_list.json') as file_obj:
    contents = json.load(file_obj)
print(contents)
# [1, 2, 3]

4.2. 保存和读取用户生成的数据

hello_world.py

import json

file_name = 'username_list.json'
try:
    with open(file_name) as file_obj:
        username = json.load(file_obj)
except FileNotFoundError:
    username = input("What's your name? ")
    with open(file_name, 'w') as file_obj:
        json.dump(username, file_obj)
    print("We'll remember you at the next time," + username + '.')
else:
    print(username.title() + ', welcome back!')

# What's your name? bob
# We'll remember you at the next time,bob.
# Bob, welcome back!

username_list.json

"bob"

5. 重构

将代码划分为一系列完成具体工作的函数,这一过程称为重构。重构让代码更清晰、更易于理解以及更容易扩展。

hello_world.py

import json

file_name = 'username_list.json'

def get_stored_user():
    '''若存储了用户名,则使用它'''
    try:
        with open(file_name) as file_obj:
            username = json.load(file_obj)
    except FileNotFoundError:
        return None
    else:
        return username

def get_new_user():
    '''存储新用户'''
    username = input("What's your name? ")
    with open(file_name, 'w') as file_obj:
        json.dump(username, file_obj)
    return username

def greet_user():
    '''问候用户'''
    username = get_stored_user()
    if username:
        print(username.title() + ', welcome back!')
    else:
        username = get_new_user()
        print("We'll remember you at the next time," + username + '.')

greet_user()
# What's your name? bob
# We'll remember you at the next time,bob.
# Bob, welcome back!

username_list.json

"bob"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可以自动生成日报的清单工具

用过了很多todolist工具&#xff08;Microsoft_ _To D、oodoist、滴答清单、印象笔记、有道笔记、&#xff09; 最终稳定一直在用的就这一个“闪点清单” 我的核心诉求就两点 1. 可以实时记录任务&#xff0c;并标记是否完成 2. 可以按天、周导出&#xff0c;自动整合成日报…

《计算机构造与解释》读书笔记(4)

文章目录1. 写在最前面2. 并发&#xff1a;时间是一个本质问题2.1 并发系统中时间的性质2.1.1 并发程序的正确行为2.2 控制并发的机制2.2.1 对共享变量的串行访问2.2.2 Schema 里的串行化2.2.3 使用多重共享资源的复杂性2.2.4 串行化实现2.2.5 死锁2.2.6 并发性、时间和通信3. …

Linux学习记录——구 进程概念的基础理解

文章目录一、操作系统概念理解二、进程的基本理解1、什么是进程&#xff1f;2、进程的属性1、指令查看进程2、目录查看进程3、进程与进程之间1、父子进程概念2、创建子进程---fork的基础使用方法3、fork原理的初级理解1、fork的操作2、fork如何看待代码和数据3、fork如何看待两…

【Docker概念和实践 2】虚拟机 ubuntu18上安装docker

一、说明 已经安装了N遍Docker了&#xff0c;逐步成了一套习惯&#xff0c;这里专门记录之&#xff1b;总之&#xff0c;安装前必须回答得问题是&#xff1a;何种操作系统、何种版本、是否虚拟机、云数据源等问题。一个环境如果装得好&#xff0c;就不需要重装&#xff0c;如果…

C语言刷题之摩尔投票法

目录 1.引入 2.摩尔投票算法 3.基本步骤 摩尔投票法分为两个阶段&#xff1a; 1.抵消阶段 2.检验阶段 4.代码实现 5.扩展沿伸 6.总结 1.引入 我们来看一个问题&#xff1a; 假设有一个无序数组长度为n&#xff0c;要求找出其中出现次数超过n/2的数&#xff0c;要求时间复…

vue3-环境搭建(docker版本)

序 大大小小项目经历无数&#xff0c;之前都是写的vue2的项目&#xff0c;因为项目需要&#xff0c;边学边用vue3&#xff0c;也算能转的开&#xff0c;但心里一直想系统的理顺一下vue3。 看了看极客时间&#xff0c;掘金小课&#xff0c;都没有能达到心里预期的“系统学习”…

免费内网穿透软件一步设置实现外网访问

在工作和生活中&#xff0c;有很多类似内网搭建服务器和外网连接内网的需求&#xff0c; 例如在任何地方都能访问自己家里的主机电脑笔记本上的应用&#xff0c;让出差外网和任何地方都能访问到公司内部局域网的服务器……这些需求我们可以统一用一个方案解决&#xff0c;那就是…

网络编程UDP+TCP

日升时奋斗&#xff0c;日落时自省 目录 1、网络编程基本概念 2、UDP数据报套接字编程 2.1、UDP相关API 2.1.1、DatagramSocket API 2.1.2、DatagramPacket API 2.2、UDP版本服务器 2.3、UDP版本客户端 2.4、UDP连接操作 2.5、翻译业务 2.6、总结 3、TCP流套接字编程 …

【项目实战】一文入门项目中Lombok的常用注解

一、Lombok介绍 1.1 Lombok是什么&#xff1f; 一个Java库&#xff0c;用于简化Java代码。 Lombok是一个非常神奇的 java 类库&#xff0c;会利用注解自动生成 java Bean 中烦人的 Getter、Setting&#xff0c;还能自动生成 logger、ToString、HashCode、Builder 等 java特色…

【GD32F427开发板试用】开发一款网络音乐播放器

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;守勤 资源介绍 非常荣幸能够参与到这次GD32F427开发板试用的活动中来&#xff0c;开发板的设计非常简洁&#xff0c;板载了一颗GD32F103C8T6和…

Python中的递归及案例演示

目录 一.什么是递归 二.案例 递归找文件 步骤 os模块中的三个方法 演示 最终代码 三.总结 一.什么是递归 递归在编程中是一种非常重要的算法 递归:即方法(函数)自己调用自己的一种特殊编程写法 如&#xff1a; 函数调用自己&#xff0c;即称之为递归调用。 二.案例 递…

C++ 引用! 他是坤坤也是鸡哥

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 目录一、前言二、引用1、引用的概念2、引用的声明3、引用的特性Ⅰ、 引用在定义时必须初始化Ⅱ、 一个变量可以有多个引用Ⅲ、引…

深度学习PyTorch 之 DNN-多分类

前面讲了深度学习&PyTorch 之 DNN-二分类&#xff0c;本节讲一下DNN多分类相关的内容&#xff0c;这里分三步进行演示 结构化数据 我们还是以iris数据集为例&#xff0c;因为这个与前面的流程完全一样&#xff0c;只有在模型定义时有些区别 损失函数不一样 二分类时用的损…

Pollard Rho算法

生日悖论 假设一年有nnn天&#xff0c;房间中有kkk人&#xff0c;每个人的生日在这nnn天中&#xff0c;服从均匀分布&#xff0c;两个人的生日相互独立 问至少要有多少人&#xff0c;才能使其中两个人生日相同的概率达到ppp 解&#xff1a;考虑k≤nk\le nk≤n 设kkk个人生日互…

Spring框架介绍及使用

文章目录1.概述1.1 Spring是什么1.2 Spring 的优势1.3 spring 的体系结构2. IoC 的概念和作用2.1 什么是程序的耦合2.2 IoC容器3. AOP的概念和作用超链接&#xff1a; Spring重点内容学习资料1.概述 1.1 Spring是什么 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源…

使用docker-compose搭建Prometheus+Grafana监控系统

一、角色分配 Prometheus 采集数据Grafana 用于图表展示redis_exporter 用于收集redis的metricsnode-exporter 用于收集操作系统和硬件信息的metricscadvisor 用于收集docker的相关metrics 二、安装Docker 可以参考&#xff1a;https://ximeneschen.blog.csdn.net/article/d…

JVM调优实战:to-space exhausted Evacuation Failure

一次线上dubbo问题的定位&#xff0c;进行JVM调优实战。问题线上dubbo接口provider抛出异常&#xff1a;org.apache.dubbo.rpc.RpcException: Failfast invoke providers ... RandomLoadBalance select from all providers ... use dubbo version 2.7.16, but no luck to perfo…

vulnhub DC系列 DC-8

总结&#xff1a;exim4提权 目录 下载地址 漏洞分析 信息收集 网站爆破 后台webshell 提权 下载地址 DC-8.zip (Size: 379 MB)Download: http://www.five86.com/downloads/DC-8.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-8.zip使用方法:解压后&#xff…

Cosmos 基础(二)-- Ignite CLI

官网 DOC GitHub 你的项目值得拥有自己的区块链。 Ignite使开发、增长和启动区块链项目比以往任何时候都更快。 Ignite CLI是一个一体化平台&#xff0c;可以在主权和安全的区块链上构建、启动和维护任何加密应用程序 Install Ignite 一、安装 你可以在基于web的Gitpod…

23种设计模式(七)——桥接模式【单一职责】

文章目录 意图什么时候使用桥接真实世界类比桥接模式的实现桥接模式的优缺点亦称:Bridge 意图 桥接模式是将抽象部分与实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。 什么时候使用桥接 1、如果一个…