Python 零基础教程

Python 文件写入

将数据写入文件是编程中的一项基础操作,它允许你持久地保存信息。

在上一章中,我们学习了如何以不同的模式打开文件进行读取。

现在,我们将重点关注将数据写入文件,这需要以允许写入的模式打开文件,然后使用 Python 插入数据。

本章将介绍不同的写入模式以及如何处理文件关闭,以确保你的数据被正确保存。

1. 写入文件:模式与操作

要将数据写入文件,你需要以某一种写入模式打开它。最常用的模式有:

  • 'w'(写入 - Write): 此模式打开文件用于写入。如果文件已存在,其原有内容会被覆盖。如果文件不存在,则会创建一个新文件。
  • 'a'(追加 - Append): 此模式打开文件用于追加。如果文件已存在,新数据会被添加在文件末尾。如果文件不存在,则会创建一个新文件。
  • 'x'(独占创建 - Exclusive Creation): 此模式打开文件用于独占创建。如果文件已经存在,该操作会失败并抛出 FileExistsError 错误。

1.1 使用 'w'(写入)模式

'w' 模式用于创建新文件或覆盖现有文件。使用此模式时要格外小心,因为它会清除文件中任何已存在的数据。

# 示例:以 'w' 模式向文件写入数据
try:
    with open('my_file.txt', 'w') as file:
        file.write('这是第一行。\n')
        file.write('这是第二行。\n')
    print("数据已成功写入 my_file.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")

# 验证文件内容:
# my_file.txt 将包含:
# 这是第一行。
# 这是第二行。

在这个例子中,with open() 语句确保了文件在写入后被正确关闭。file.write() 方法将指定的字符串写入文件。\n 字符用于插入换行符,确保每一行内容都写在文件中的独立行上。

1.2 使用 'a'(追加)模式

'a' 模式用于在现有文件的末尾添加数据。如果文件不存在,它会创建一个新文件。这在记录日志或向文件添加数据且不想覆盖其原有内容时非常有用。

# 示例:以 'a' 模式向文件追加数据
try:
    with open('my_file.txt', 'a') as file:
        file.write('这是第三行(追加的内容)。\n')
    print("数据已成功追加到 my_file.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")

# 验证文件内容:
# my_file.txt 现在将包含:
# 这是第一行。
# 这是第二行。
# 这是第三行(追加的内容)。

在这个例子中,新的一行被追加到了 my_file.txt 的现有内容之后。如果 my_file.txt 之前不存在,系统会自动创建它。

1.3 使用 'x'(独占创建)模式

'x' 模式用于创建一个新文件,但仅当该文件不存在时才有效。如果文件已存在,则会引发 FileExistsError。当你想确保不会意外覆盖现有文件时,这个模式非常有用。

# 示例:使用 'x' 模式创建一个新文件
try:
    with open('new_file.txt', 'x') as file:
        file.write('这是新文件中的第一行。\n')
    print("new_file.txt 已创建,数据写入成功。")
except FileExistsError:
    print("错误:new_file.txt 已经存在。")
except Exception as e:
    print(f"发生了一个错误:{e}")

如果 new_file.txt 已经存在,程序将打印“错误:new_file.txt 已经存在。”。否则,它将创建该文件并写入指定的内容。

2. 写入不同数据类型

file.write() 方法只接受字符串作为输入。如果你想写入其他数据类型(例如整数、浮点数、列表),你需要先将它们转换为字符串。

2.1 写入数字

要将数字写入文件,你可以使用 str() 函数将它们转换为字符串。

# 示例:将数字写入文件
try:
    with open('numbers.txt', 'w') as file:
        number1 = 10
        number2 = 3.14
        file.write(str(number1) + '\n')
        file.write(str(number2) + '\n')
    print("数字已成功写入 numbers.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")

# 验证文件内容:
# numbers.txt 将包含:
# 10
# 3.14

在这个例子中,str(number1)str(number2) 在将整数 10 和浮点数 3.14 写入文件之前,先将它们转换成了字符串。

2.2 写入列表或元组

要将列表或元组写入文件,你可以遍历它们,将每个元素转换为字符串并拼接起来。

# 示例:将列表写入文件
try:
    my_list = ['苹果', '香蕉', '樱桃']
    with open('fruits.txt', 'w') as file:
        for fruit in my_list:
            file.write(fruit + '\n')
    print("列表已成功写入 fruits.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")

# 验证文件内容:
# fruits.txt 将包含:
# 苹果
# 香蕉
# 樱桃

2.3 写入字典

要将字典写入文件,你通常需要以一种方便日后读回的格式对它们进行格式化。一种常见的方法是将字典转换为 JSON 字符串(我们将在后面的模块中讨论相关模块)。

# 示例:将字典写入文件(简化版,不使用 JSON)
try:
    my_dict = {'姓名': 'Alice', '年龄': 30, '城市': '纽约'}
    with open('person.txt', 'w') as file:
        for key, value in my_dict.items():
            file.write(f'{key}: {value}\n')
    print("字典已成功写入 person.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")

# 验证文件内容:
# person.txt 将包含:
# 姓名: Alice
# 年龄: 30
# 城市: 纽约

此示例遍历了字典,并将每个键值对用冒号分隔后写入文件。

3. 处理文件关闭

在写入完成后正确关闭文件至关重要,这能确保所有数据都被真正写入磁盘,并释放系统资源。with open() 语句会自动处理文件的关闭,即使在此过程中发生了错误。如果你不使用 with 语句,则需要使用 file.close() 方法手动关闭文件。

3.1 使用 with open()(推荐)

with open() 语句是处理文件的首选方式,因为它会自动关闭文件,无论是否发生异常。

# 示例:使用 'with open()' 自动关闭文件
try:
    with open('example.txt', 'w') as file:
        file.write('这是一行文本。')
    print("数据已写入 example.txt,并且文件已自动关闭。")
except Exception as e:
    print(f"发生了一个错误:{e}")

3.2 手动关闭文件

如果你不使用 with open() 语句,你必须使用 file.close() 手动关闭文件。

# 示例:手动关闭文件
import io # 需要导入 io 模块以支持下面的 isinstance 检查

try:
    file = open('example.txt', 'w')
    file.write('这是一行文本。')
    file.close()  # 手动关闭文件
    print("数据已写入 example.txt,并且文件已手动关闭。")
except Exception as e:
    print(f"发生了一个错误:{e}")
finally:
    # 确保无论是否发生错误,文件都能被关闭
    if 'file' in locals() and isinstance(file, io.IOBase) and not file.closed:
        file.close()

重要注意事项:

  • 始终确保文件被关闭,尤其是在写入之后,以防止数据丢失和资源泄漏。
  • 强烈推荐使用 with open() 语句,因为它能自动且安全地处理文件的关闭。

4. 编程实战练习

1. 创建一个程序,获取用户的输入并将其写入名为 user_input.txt 的文件中。用户的每一次输入都应作为单独的一行写入文件。

try:
    with open('user_input.txt', 'w') as file:
        while True:
            line = input("请输入一行文本(或输入 'done' 结束):")
            if line.lower() == 'done':
                break
            file.write(line + '\n')
    print("数据已成功写入 user_input.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")

2. 编写一个程序,从用户那里读取一个名字列表,并将它们追加到名为 names.txt 的文件中。如果该文件不存在,请确保程序能自动创建它。

try:
    with open('names.txt', 'a') as file:
        while True:
            name = input("请输入一个名字(或输入 'done' 结束):")
            if name.lower() == 'done':
                break
            file.write(name + '\n')
    print("名字已成功追加到 names.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")

3. 创建一个程序,将数字 1 到 100 写入名为 numbers.txt 的文件中,每个数字占一行。

try:
    with open('numbers.txt', 'w') as file:
        for i in range(1, 101):
            file.write(str(i) + '\n')
    print("数字已成功写入 numbers.txt。")
except Exception as e:
    print(f"发生了一个错误:{e}")