文件和异常

这里写目录标题

  • 1. 读取文件
    • 1.1 读取文件的全部内容
    • 1.2 相对文件路径和绝对文件路径
    • 1.3 访问文件中的各行
    • 1.4 使用文件的内容
    • 1.5 包含100万位的大型文件
    • 1.6 圆周率值中包含你的生日吗
    • 2. 写入文件
    • 2.1 写入一行
    • 2.2 写入多行
  • 3. 异常
    • 3.1 处理ZeroDivisionError异常
    • 3.2 使用try-except代码块
    • 3.3 使用异常避免崩溃
    • 3.4 else代码块
    • 3.5 处理FileNotFoundError异常
    • 3.6 分析文本
    • 3.7 使用多个文件
    • 3.8 静默失败
    • 3.9 决定报告哪些错误
  • 4. 存储数据
    • 4.1 使用json.dumps()和json.loads()
    • 4.2 保存和读取用户生成的数据
    • 4.3 重构

1. 读取文件

1.1 读取文件的全部内容

要读取文件的全部内容,可以使用 Python 中的 open() 函数打开文件,并使用 read() 方法读取文件的内容。示例代码如下所示:

file_name = 'file.txt'  # 文件名

with open(file_name) as file_object:
    contents = file_object.read()
    print(contents)

上述代码中,利用 open() 函数打开一个名为 file.txt 的文件,然后使用 read() 方法将文件中的全部内容读取到 contents 变量中,并最终打印出来。请确保文件 file.txt 存在并包含内容。

1.2 相对文件路径和绝对文件路径

在读取文件时,可以使用相对文件路径或绝对文件路径。相对文件路径指的是相对于当前 Python 脚本运行的位置的相对路径,而绝对文件路径是文件在文件系统中的完整路径。示例代码如下所示:

file_path = 'files/file.txt'  # 相对文件路径
# file_path = '/home/user/files/file.txt'  # 绝对文件路径

with open(file_path) as file_object:
    contents = file_object.read()
    print(contents)

上述代码中,file.txt 文件被放置在名为 files 的目录下,它与当前 Python 脚本所在的目录是同级关系。对于相对文件路径的使用,需要在文件名前指定所在的目录。如果要使用绝对文件路径,可以直接提供完整的文件路径。

1.3 访问文件中的各行

除了读取文件的全部内容外,还可以按行访问文件中的内容。使用 readlines() 方法可以将文件逐行读取到一个列表中,方便进行进一步的处理。示例代码如下所示:

file_name = 'file.txt'  # 文件名

with open(file_name) as file_object:
    lines = file_object.readlines()

for line in lines:
    print(line.rstrip())

上述代码中,首先使用 readlines() 方法将文件的各行读取到列表 lines 中。随后,使用 rstrip() 方法去除每行末尾的换行符,并通过 print() 函数将每行内容打印出来。

1.4 使用文件的内容

读取文件后,可以将其内容赋值给一个变量,以便后续使用。示例代码如下所示:

file_name = 'file.txt'  # 文件名

with open(file_name) as file_object:
    contents = file_object.read()

# 对文件内容进行处理
new_contents = contents.upper()
print(new_contents)

上述代码中,首先将文件的全部内容读取到 contents 变量中。随后,根据需求对文件内容进行了一些处理,即将全部字符转换为大写字母,并将结果赋值给 new_contents 变量。最后将新的内容打印出来。

1.5 包含100万位的大型文件

Python 能够处理包含大量数据的文件。下面介绍一个将圆周率值保存到一个文件中的示例。

首先,我们使用第三方库 mumpy 中的 pi 变量,它可以提供圆周率值。然后,将这个值保存到名为 pi_digits.txt 的文件中。示例代码如下所示:

import numpy as np

digits = 1000000  # 需要保存的圆周率位数

pi = str(np.pi)[:digits]

file_name = 'pi_digits.txt'  # 文件名

with open(file_name, 'w') as file_object:
    file_object.write(pi)

上述代码中,首先导入了 numpy 库并引入了其中的 pi 变量,用于获取圆周率值。然后,将 pi 值截取到指定的位数,并将其转换为字符串。接下来,使用 open() 函数打开文件 pi_digits.txt,并指定以写入模式打开。最后,使用 write() 方法将圆周率值写入到文件中。

1.6 圆周率值中包含你的生日吗

如果你感兴趣,可以使用 Python 编写程序来搜索圆周率值中是否包含你的生日。下面是一个简单的示例代码:

file_name = 'pi_digits.txt'  # 文件名

with open(file_name) as file_object:
    contents = file_object.read()

birthday = '20060101'  # 生日

if birthday in contents:
    print("Yes, your birthday is in pi!")
else:
    print("Sorry, your birthday is not in pi.")

上述代码中,首先将文件 pi_digits.txt 的内容读取到变量 contents 中。然后,定义了生日字符串 birthday。最后,通过判断生日是否存在于 contents 中来给出相应的输出。如果生日存在于圆周率值中,则打印 “Yes, your birthday is in pi!”,否则打印 “Sorry, your birthday is not in pi.”。

2. 写入文件

2.1 写入一行

要将内容写入文件,可以使用 Python 中的 open() 函数以写入模式打开文件,并使用 write() 方法写入内容。示例代码如下所示:

file_name = 'output.txt'  # 文件名

with open(file_name, 'w') as file_object:
    file_object.write("Hello, world!")

上述代码中,使用 open() 函数打开一个名为 output.txt 的文件,并指定以写入模式打开。随后,使用 write() 方法将字符串 “Hello, world!” 写入到文件中。请注意,如果文件已经存在,那么写入操作会覆盖原有的内容。

2.2 写入多行

如果要将多行内容写入文件,可以使用循环和 write() 方法实现。示例代码如下所示:

file_name = 'output.txt'  # 文件名

lines = ['Line 1', 'Line 2', 'Line 3']

with open(file_name, 'w') as file_object:
    for line in lines:
        file_object.write(line + '\n')

上述代码中,首先定义了一个包含多行内容的列表 lines。随后,使用 open() 函数打开文件 output.txt 并指定以写入模式打开。接下来,使用 for 循环遍历列表 lines 中的每一行,并使用 write() 方法将行内容写入文件中。需要注意的是,在每一行的末尾添加换行符 \n,以保证写入的内容在文件中占据一行。

代码执行后,将会在指定的文件中写入相应的内容。在上述示例代码中,将会在 output.txt 文件中写入 “Hello, world!” 或者多行内容 “Line 1”、“Line 2”、“Line 3”。

3. 异常

3.1 处理ZeroDivisionError异常

在编写程序时,可能会遇到除零错误(ZeroDivisionError),这是一个常见的错误类型。为了避免程序崩溃,可以使用异常处理来处理该错误。示例代码如下所示:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("除零错误发生!")

上述代码中,使用 try-except 结构来处理可能会引发除零错误的代码块。在 try 代码块中,将对 10 / 0 这个除法操作进行尝试。如果遇到了除零错误,将会抛出 ZeroDivisionError 异常,并通过 except 代码块中的代码来处理这个异常。在上面的示例中,当除零错误发生时,将会打印出 “除零错误发生!”。

3.2 使用try-except代码块

除了处理特定类型的异常,还可以使用通用的 except 代码块来处理其他异常。示例代码如下所示:

try:
    # 可能会引发异常的代码块
    result = 10 / 0
except Exception as e:
    # 异常处理代码
    print("发生了异常:", e)

上述代码中,通过将 Exception 作为 except 的参数,来捕获所有类型的异常。使用 as 关键字将异常对象赋给变量 e,以便在异常处理代码块中使用。当发生异常时,将会打印出异常信息。

3.3 使用异常避免崩溃

如果程序中的某些代码可能会导致异常,可以使用异常处理来避免程序崩溃。示例代码如下所示:

try:
    # 可能会引发异常的代码块
    result = 10 / 0
except ZeroDivisionError:
    # 异常处理代码
    print("除零错误发生!")
except Exception as e:
    # 异常处理代码
    print("发生了异常:", e)
else:
    # 如果没有引发异常,执行此代码块
    print("没有发生异常!")

上述代码中,先尝试执行可能会引发异常的代码块。如果发生除零错误,则会执行第一个 except 代码块中的代码。如果发生其他类型的异常,则会执行第二个 except 代码块中的代码。如果没有发生异常,将会执行 else 代码块中的代码。

3.4 else代码块

在异常处理中,可以使用 else 代码块来处理在没有发生异常时需要执行的代码。示例代码如下所示:

try:
    # 可能会引发异常的代码块
    result = 10 / 2
except ZeroDivisionError:
    # 异常处理代码
    print("除零错误发生!")
except Exception as e:
    # 异常处理代码
    print("发生了异常:", e)
else:
    # 如果没有引发异常,执行此代码块
    print("结果为:", result)

上述代码中,尝试执行除法操作 10 / 2,由于这是一个合法的操作,没有发生异常。因此,会执行 else 代码块,打印出结果 “结果为: 5.0”。

3.5 处理FileNotFoundError异常

在处理文件操作时,如果文件不存在,将会抛出 FileNotFoundError 异常。可以使用异常处理来处理该异常,以防止程序崩溃。示例代码如下所示:

try:
    with open("file.txt") as file_object:
        contents = file_object.read()
except FileNotFoundError:
    print("文件不存在!")

上述代码中,使用 open() 函数尝试打开一个名为 file.txt 的文件。如果文件不存在,则会抛出 FileNotFoundError 异常,并执行相应的异常处理代码块。在上面的示例中,将打印出 “文件不存在!”。

3.6 分析文本

在处理文件内容时,可以将读取的文本进行进一步的分析和处理。示例代码如下所示:

try:
    with open("file.txt") as file_object:
        contents = file_object.read()
        words = contents.split()
        num_words = len(words)
        print("文件中单词的数量为:", num_words)
except FileNotFoundError:
    print("文件不存在!")

上述代码中,读取文件中的全部内容,并使用 split() 方法将文本拆分成单词,并将单词存储在列表 words 中。然后,通过获取列表的长度,即可得到文件中单词的数量,并将结果打印出来。

3.7 使用多个文件

可以在异常处理中处理多个文件的操作,以防止其中任何一个文件不存在。示例代码如下所示:

file_names = ['file1.txt', 'file2.txt', 'file3.txt']

for file_name in file_names:
    try:
        with open(file_name) as file_object:
            contents = file_object.read()
            print(contents)
    except FileNotFoundError:
        print(f"文件{file_name}不存在!")

上述代码中,通过使用 for 循环遍历文件名列表 file_names,并在每次迭代中尝试打开文件,并打印出其内容。如果文件不存在,则会发生 FileNotFoundError 异常,并执行相应的异常处理代码块。在上面的示例中,将会打印出每个文件的内容,或者 “文件不存在!”。

3.8 静默失败

有时候,我们可能希望在遇到异常时不打印任何错误信息,这种情况下可以使用 pass 语句来实现静默失败。示例代码如下所示:

try:
    result = 10 / 0
except ZeroDivisionError:
    pass

在上述代码中,尝试进行除零操作,由于除零是一个无效的操作,将会抛出 ZeroDivisionError 异常。但是由于使用了 pass 语句,异常被静默处理,不会产生任何错误信息。

3.9 决定报告哪些错误

可以根据需要决定是否报告特定的错误。示例代码如下所示:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("除零错误发生!")
except FileNotFoundError:
    pass

在上述代码中,将除零错误进行了报告,但对文件不存在的错误进行了静默处理。根据需要,可以自定义异常处理代码块,选择性地报告或静默处理特定的错误。

4. 存储数据

4.1 使用json.dumps()和json.loads()

在Python中,可以使用 json 模块来处理 JSON 格式的数据。json 模块提供了 dumps()loads() 函数,用于将 Python 对象和 JSON 字符串之间进行转换。示例代码如下所示:

import json

# 将 Python 对象转换为 JSON 字符串
data = {'name': 'John', 'age': 25}
json_str = json.dumps(data)

# 将 JSON 字符串转换为 Python 对象
decoded_data = json.loads(json_str)

print(json_str)
print(decoded_data)

上述代码中,首先导入了 json 模块。使用 dumps() 函数将 Python 字典对象 data 转换为 JSON 字符串 json_str,并将其打印出来。然后,使用 loads() 函数将 JSON 字符串 json_str 转换为 Python 对象 decoded_data,并将其打印出来。

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

有时候我们需要保存用户生成的数据,以便下次使用时可以加载并继续操作。可以使用 json 模块将用户数据保存到文件中,然后在需要的时候读取出来。示例代码如下所示:

import json

# 保存用户生成的数据
data = {'name': 'John', 'age': 25}

file_name = 'user_data.json'  # 文件名

with open(file_name, 'w') as file_object:
    json.dump(data, file_object)

# 读取用户生成的数据
with open(file_name) as file_object:
    loaded_data = json.load(file_object)

print(loaded_data)

上述代码中,首先定义了用户生成的数据 data。使用 open() 函数以写入模式打开名为 user_data.json 的文件,并使用 json.dump() 函数将数据保存到文件中。随后,使用 open() 函数以读取模式打开文件 user_data.json,并使用 json.load() 函数将文件中的数据加载到 loaded_data 变量中。最后将加载的数据打印出来。

4.3 重构

当代码变得复杂时,可以考虑对其进行重构,以提高代码的可读性和可维护性。重构的目标是保持代码功能的不变,但改善其结构和组织方式。示例代码如下所示:

import json

def save_data(data, file_name):
    with open(file_name, 'w') as file_object:
        json.dump(data, file_object)

def load_data(file_name):
    with open(file_name) as file_object:
        loaded_data = json.load(file_object)
    return loaded_data

# 保存用户生成的数据
data = {'name': 'John', 'age': 25}
save_data(data, 'user_data.json')

# 读取用户生成的数据
loaded_data = load_data('user_data.json')
print(loaded_data)

上述代码中,将保存数据和读取数据的操作封装成了两个函数 save_data()load_data()。这样可以将主要的逻辑和操作进行分离,并提高代码的可重用性。当需要保存数据时,只需要调用 save_data() 函数,并传入要保存的数据和文件名。当需要读取数据时,只需要调用 load_data() 函数,并传入文件名,最后将返回的数据打印出来。

你可能感兴趣的:(python)