Skip to content

文件与异常

约 792 个字 60 行代码 预计阅读时间 3 分钟

文件读写

Python 提供了内置的 open(filename, mode='r', encoding=None) 函数用于打开文件,返回一个文件对象,常用于读写文本或二进制数据。

模式参数(mode)说明

模式 含义
"r" 只读模式,文件不存在会抛出异常(FileNotFoundError)
"w" 写入模式,文件不存在则创建,存在则清空原内容
"a" 追加模式,写入内容追加到文件末尾
"b" 二进制模式(可与 r/w/a 组合使用)
"t" 文本模式,默认值(也可与其他模式组合)

文件基本操作

方法 说明
read([size]) 读取文件内容,参数为读取的字节数,不写默认读取所有内容
readline() 读取一行内容(包含换行符)
readlines() 读取所有行,返回列表(包含换行符)
write(s) 向文件写入字符串,如果本身有内容会覆盖
writelines(list) 向文件写入字符串列表 (无自动换行)
seek(offset, whence=0) 设置读写位置;whence=0表示从文件开头,1表示当前位置,2表示文件末尾
tell() 返回当前文件读写位置,windows下换行符是两个字符
close() 关闭文件,释放资源

使用 with

with语句会创建一个上下文管理器对象,它用于规定某个对象的使用范围,相当于你可以认为这个对象离开它的作用域会自动析构(连接之类的东西是自动关闭),使用它可以有效的管理资源。

# 退出循环自动释放资源
with open("score.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())  # strip() 去除换行符

特殊输入读取

标准输入读多行数据,可使用 sys.stdin.readlines()

import sys
# sys.stdin 是标准输入流,即standard inputstream
lines = sys.stdin.readlines()
for line in lines:
    print(line.strip())

异常处理

Python 的异常处理使用 try-except 语句块进行,不是catch

基本结构

try:
    # 可能抛出异常的代码
except ExceptionType:
    # 捕获特定异常后的处理代码
else:
    # 无异常时执行
finally:
    # 无论是否异常都会执行

捕获所有异常:

try:
    ...
except Exception as e:
    print("发生异常:", e)

抛出异常 raise

def div(a, b):
    if b == 0:
        raise ValueError("除数不能为0")
    return a / b

assert 断言

Python 的断言本质上也是抛出错误

  • assert 条件表达式:若条件为 False,抛出 AssertionError
  • assert 条件, 错误信息:可自定义异常信息
x = -1
assert x >= 0, "x 不能为负数"

CSV

CSV 是一种逗号分隔值 (Comma Separated Values) 文件格式,它是纯文本,而Excel是二进制文件。它是一种简单的文本格式,用于存储表格数据,比如电子表格或数据库。

Python内置了csv,因为CSV本身是纯文本,所以是比较好处理的:

import csv

with open('your_file.csv', 'r', encoding='utf-8') as file:
    # csv.reader 返回一个迭代器
    reader = csv.reader(file)
    header = next(reader)  # 读取标题行
    print(f"标题行: {header}")
    for row in reader:
        print(f"数据行: {row}")

但是上面这种和readline其实没什么区别,用的更多的是

import csv

with open('your_file.csv', 'r', encoding='utf-8') as file:
    # 将每一行数据读取为一个字典,字典的键是标题行的列名,值是该行对应列的数据。
    reader = csv.DictReader(file)
    for row in reader:
        print(f"姓名: {row['姓名']}, 年龄: {row['年龄']}, 城市: {row['城市']}")

写的话也是类似的

# 不指定newline很可能会出现多余的换行
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerows(data_to_write)

字典形式

import csv

data_to_write = [
    ['姓名', '年龄', '城市'],
    ['赵六', '28', '深圳'],
    ['孙七', '33', '杭州']
]

with open('output_semicolon.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, delimiter=';')
    writer.writerows(data_to_write)

print("使用分号分隔的数据已成功写入 output_semicolon.csv 文件")

json

json(javascript object notion JS的对象表示法),JSON 独立于语言,json是纯文本。JSON 字符串必须使用双引号,主要是为了不同编程语言的规范,单双引号未必相同。

Python本身就是一个巨大的字典,而json也是字典,所以转化起来是很容易的,Python内置的json库就提供了支持:

  • json.dumps(obj):将python对象序列化为json格式的字符串
  • json.dump(obj, file):将python对象序列化为json格式并写入文件
  • json.loads(json):将json风格的字符串反序列化为python对象
  • json.load(json,json):将文件中的内容反序列为python对象

除此之外还有pickle,区别是不是转化到文本,而是字节流