在某些情况下,我们需要去处理一个文件类型的,诸如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 块中的代码。
需要注意的是,异常处理应该尽可能精确地捕获并处理具体的异常类型,以便针对不同的异常情况采取适当的措施。同时,避免在异常处理代码块中放置过多的代码,以免混淆和隐藏实际的问题。最好将异常处理限制在可能引发异常的代码块周围,以保持代码的简洁性和可读性。