(五)、文件与异常

在某些情况下,我们需要去处理一个文件类型的,诸如txt文件和csv文件,此时我们就有一些列的方式包括打开、读取、写入、关闭等。

一、文件

(一)文件的路径

不管是打开一个文件亦或是新建一个文件,我们都需要明白这个文件所处的位置,也就是文件的路径,才能更好地、正确的调用编辑。
文件的路径可以分为绝对路径和相对路径

  • 绝对路径:是指从文件系统的根目录开始的完整路径。它包含了文件在文件系统中的完整位置,可以唯一地定位一个文件。
C:\Users\Username\Documents\file.txt
  • 相对路径:是指相对于当前工作目录或某个参考点的文件路径。它不包含完整的文件系统路径,而是描述文件相对于当前位置的位置。相对路径通常更短、更简洁,并且依赖于参考点。
C:\\Users\\Username\\Documents\\file.txt
Documents\\file.txt
 C:\\Documents

值得注意的是,由于“\”与某些字符连用会形成“转义字符”,例如“\n”、“\t”等此时,我们要使用“r+路径”,例如:

f=open('C:\Users\zhang\nesktop\.idea')#"/n"形成转义字符,无法正常调用
f=open(r'C:\Users\zhang\nesktop\.idea')#用r取消转义字符,可以正常调用

r表示取消后续字符串中“/”的转义特性。

(二)文件的操作模式

文件可以分为文本文件、二进制文件,处理的方式也可分为只读、只写等。

  • “r”(读取模式):以只读模式打开文件。如果文件不存在,会发生异常。
  • “w”(写入模式):以写入模式打开文件。如果文件存在,会被覆盖;如果文件不存在,会创建新文件。
  • “a”(追加模式):以追加模式打开文件。如果文件存在,新内容将被追加到文件末尾;如果文件不存在,会创建新文件。
  • “x”(独占写入模式):以独占写入模式创建文件。如果文件已经存在,会引发异常。
  • “b”(二进制模式):以二进制模式打开文件,可以处理二进制文件(如图片、音频等)。可与其他模式一起使用,如 “rb”、“wb”、“ab” 等。
  • “t”(文本模式,默认模式):以文本模式打开文件,用于处理文本文件。可与其他模式一起使用,如 “rt”、“wt”、“at” 等。
  • “+”(读写模式):可与其他模式一起使用,表示文件既能读取又能写入。如 “r+”、“w+”、“a+” 等。

文件的操作模式一般要写在文件的打开部分

# 以读取模式打开文件
file1 = open("example.txt", "r")

# 以写入模式打开文件
file2 = open("example.txt", "w")

# 以追加模式打开文件
file3 = open("example.txt", "a")

# 以独占写入模式创建文件
file4 = open("example.txt", "x")

# 以二进制模式读取文件
file5 = open("example.txt", "rb")

# 以文本模式写入文件
file6 = open("example.txt", "wt")

# 以读写模式打开文件
file7 = open("example.txt", "r+")

(三)文件的打开

文件的打开可以使用两种方式:

open方法
open(文件名,操作模式)这是最基础的打开方式

a=open("abc.txt","r")

with open 方法
with open(文件名,操作模式)as 变量名:

with open('abc.txt', 'r') as file_obj:
#最后的冒号不能忘记

在with open方法打开的文件,可以直接对变量名的内容进行处理

with open('abc.txt', 'r') as file_obj:
    for line in file_obj:
    print(line)
#分行打印了'abc.txt'文件中的每一行内容

(四)文件的读取

读文件有两种方法

read()
一般用于直接读取文件里的全部内容,读取后为字符串型
readline()
一般用于读取文件里的一行(段)内容,读取后为字符串型
类似的,实现readline的功能还可以像上文中直接open文件之后:

with open('abc.txt', 'r') as file_obj:
    
    for line in file_obj:
        print(line)

(五)文件的修改(写入)

文件的写入有两种方式,分别为write()和writelines()

write()方法用于写入单行文本或二进制数据到文件中。

变量名.write(内容)

writelines()方法用于写入多行文本或二进制数据到文件中。

变量名.writelines(内容)

例如:

# 打开文件
file = open('example.txt', 'w')
# 写入单行文本
file.write('Hello, world!\n')
# 关闭文件
file.close()
# 打开文件
file = open('example.txt', 'w')
# 写入多行文本
lines = ['Hello, world!\n', 'Welcome to Python!\n']
file.writelines(lines)
# 关闭文件
file.close()

(六)文件的关闭

在Python中打开文件后,最后一定要记得关闭文件。关闭文件的目的是释放系统资源并刷新输出缓冲区,确保写入的数据被正常保存到文件中。
关闭文件可以使用close()方法:

变量名.close()

除了手动关闭文件,还可以使用with语句来自动管理文件的打开和关闭,这样可以确保文件在使用完后自动关闭,避免出现文件句柄泄漏等问题。

with open('example.txt', 'r') as file:
    # 读取文件内容
    content = file.read()
    # 文件自动关闭

上述代码中,open()函数返回文件对象,然后使用with语句将该文件对象赋值给变量file,在with块内读取文件内容,with块执行完毕后会自动关闭文件。

(七)csv文件的处理

要处理csv文件,一定要记住最开头加上“import csv”,要调用csv库,才能处理csv文件
例如:

import csv
with open('example.csv', 'r') as file_obj:
    reader = csv.reader(file_obj)#此处一定要使用“csv.reader”,csv.writer是csv库里专门处理csv文件读取的方法
    for row in reader:#这里读取的就是csv文件的一行内容,以列表的形式展现出来
        print(row)

以上代码使用csv.reader()函数将csv文件对象转换为csv.reader对象,并使用for循环逐行读取csv文件内容并打印为列表形式。

如果需要将数据写入csv文件中,可以使用csv.writer()函数。以下是一个将二维列表写入csv文件的示例:

import csv
data = [['Name', 'Age', 'City'],
        ['Alice', '20', 'Beijing'],
        ['Bob', '22', 'Shanghai'],
        ['Charlie', '25', 'Guangzhou']]
with open('example.csv', 'w', newline='') as file_obj:
    writer = csv.writer(file_obj)#csv.writer是csv库里专门处理csv文件写入的方法
    for row in data:
        writer.writerow(row)

以上代码将一个二维列表data写入example.csv文件中,每个列表元素占据csv文件的一行,用,隔开。注意,在打开csv文件时需要指定newline=''参数,否则写入的csv文件将会有重复空行。

二、异常

在Python中,异常处理是一种机制,用于捕获和处理程序运行过程中可能发生的错误或异常情况。异常处理可以帮助我们优雅地处理异常,并对出现的问题做出适当的响应,以保证程序的稳定性和可靠性。

异常的分类

在Python中,常见的异常类型包括但不限于以下几种:

SyntaxError:语法错误,在代码编写过程中违反了Python的语法规则。
IndentationError:缩进错误,通常是代码缩进不正确导致的问题。
NameError:名称错误,尝试使用一个不存在的变量或函数名称。
TypeError:类型错误,操作或函数应用于不兼容的数据类型。
ValueError:值错误,函数或操作接收到了一个非法或无效的参数值。
ZeroDivisionError:零除错误,尝试进行除法运算时除数为零。
IndexError:索引错误,当尝试访问列表、元组或字符串等序列中不存在的索引时发生。
KeyError:键错误,尝试使用字典中不存在的键时发生。
FileNotFoundError:文件未找到错误,尝试打开一个不存在的文件时发生。
IOError:输入/输出错误,与文件或流相关的输入/输出操作发生错误。
AttributeError:属性错误,尝试访问一个对象中不存在的属性或方法。
ImportError:导入错误,尝试导入一个不存在的模块或包时发生。

除了上述常见的异常类型外,还有许多其他内置的异常类型和自定义的异常类型,可以根据实际需求进行使用和定义。

在异常处理时,通常可以使用 try-except 语句块捕获不同类型的异常,并提供相应的处理逻辑。此外,还可以使用 try-except-else-finally 结构来进一步完善异常处理逻辑。

异常的处理

在Python中,我们使用 try-except 语句块来进行异常处理。try 代码块用于包裹可能会引发异常的代码,而 except 代码块则用于指定在发生异常时要执行的相关操作。

下面是一个简单的异常处理的示例:

try:
    # 可能会引发异常的代码块
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
    print("结果:", result)
except ValueError:
    print("输入的不是有效的整数,请重新输入。")
except ZeroDivisionError:
    print("除数不能为零,请重新输入。")

在上述示例中,我们尝试将用户输入的两个整数进行相除并打印结果。但是,如果用户输入的内容无法转换为整数(ValueError),或者第二个数为零导致除法运算错误(ZeroDivisionError),就会引发异常。在这种情况下,我们使用了两个 except 代码块来捕获不同类型的异常,并分别输出相应的错误信息。

除了使用具体的异常类型来捕获异常之外,还可以使用 except 关键字后不带任何异常类型的 except 代码块来捕获所有类型的异常。例如:

try:
    # 可能会引发异常的代码块
    # ...
except:
    # 捕获所有类型的异常
    # ...

此外,还可以使用 else 和 finally 块来进一步完善异常处理逻辑。else 块用于指定当没有异常发生时要执行的代码,而 finally 块中的代码无论是否发生异常都会执行。

下面是一个包含 else 和 finally 块的异常处理示例:

try:
    # 可能会引发异常的代码块
    # ...
except ValueError:
    print("输入的不是有效的整数,请重新输入。")
except ZeroDivisionError:
    print("除数不能为零,请重新输入。")
else:
    print("计算完成。")
finally:
    print("程序执行结束。")

在上述示例中,如果没有发生异常,则会执行 else 块中的代码;无论是否发生异常,最终都会执行 finally 块中的代码。

需要注意的是,异常处理应该尽可能精确地捕获并处理具体的异常类型,以便针对不同的异常情况采取适当的措施。同时,避免在异常处理代码块中放置过多的代码,以免混淆和隐藏实际的问题。最好将异常处理限制在可能引发异常的代码块周围,以保持代码的简洁性和可读性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值