要我说啊,学 python,逃不过跟文件打交道。你想啊,你写个程序,辛辛苦苦处理了半天数据,结果运行完了啥都没留下?那不是白忙活嘛!所以,python怎么写入 文件,这可不是小事儿,这是把你的劳动成果“固化”下来的关键一步。别觉得它枯燥,这就像给你辛勤耕耘的田地,找个地方把收成妥妥地存起来,以后想用随时都能拿。

我刚开始学那会儿,对这块儿也是懵懵懂懂。写入 文件?不就是往里头塞东西呗?想得太简单了!这里头门道可多着呢。最基础的,咱们得会用那个神奇的 `open()` 函数。它就像是文件的“大门钥匙”。用它打开文件,才能进门干活儿。

比如,你想写点儿文字进去,最常见的就是用 `'w'` 模式打开。`'w'` 是啥意思?就是 write,写入!但你得注意了,这个 `'w'` 模式有点霸道,它会直接清空文件里原有的一切,然后从头开始写。就像你在白纸上写字,先把你原来写的东西擦得干干净净,再写新的。如果文件本来不存在?没关系,`'w'` 模式还会贴心地帮你创建它!所以,用 `'w'` 模式,代码大概长这样:

“`python

这是我想写的内容

content_to_write = "你好,世界!\n这是Python写入的第一行。\n这是第二行。"

使用 'w' 模式打开文件,文件名为 my_first_file.txt

with open(…) 这种写法是个好习惯,能保证文件用完自动关闭

with open('my_first_file.txt', 'w', encoding='utf-8') as f:

调用 write() 方法把内容写进去

f.write(content_to_write)

print("内容已写入 my_first_file.txt 文件。")

“`

看到没?`open()` 函数里除了文件名和模式 `'w'`,我还加了个 `encoding='utf-8'`。这个编码非常重要!特别是你要写中文或者其他非英文字符的时候,不指定编码,很容易出现乱码,打开文件一看,全是“???”或者奇奇怪怪的符号,那叫一个头大!`'utf-8'` 是目前最常用、兼容性最好的编码方式,用它就对了,能省好多麻烦。

上面的代码里,我用了 `with open(…) as f:` 这种结构。强烈推荐你养成这个习惯!这叫上下文管理器。它能确保你在文件操作完成后,不管程序有没有出错,文件都能被妥善地关闭掉。你想想,你打开一个文件,往里写了东西,结果忘了关门,这文件就一直被你的程序占着,别的程序可能就没法操作它了,而且还浪费系统资源。用了 `with` 语句,就像是自动给你配了个“文件操作后清理工”,省心又安全。手动关文件得用 `f.close()`,但万一中间代码报错跳出了呢?`with` 就能帮你兜底。

那么,如果我们不想清空原有内容,只想在文件末尾追加新内容呢?这时候,就轮到 `'a'` 模式出场了!`'a'` 就是 append(追加)的意思。它会找到文件的末尾,然后在那里接着写,不会动文件里原来的东西。这就像你在日记本上写字,写完今天的,明天接着往后写,不会把昨天的撕掉。如果文件不存在?`'a'` 模式也和 `'w'` 一样,会帮你创建。

“`python

接着上面的例子,再追加点儿内容

more_content = "\n这是后来追加的内容。\n生活还得继续!"

使用 'a' 模式打开同一个文件

with open('my_first_file.txt', 'a', encoding='utf-8') as f:

继续使用 write() 方法

f.write(more_content)

print("更多内容已追加到 my_first_file.txt 文件末尾。")

“`

运行上面这段代码,你再去看看 `my_first_file.txt` 文件,就会发现,原来那几行字还在,后面多了“这是后来追加的内容”和“生活还得继续!”这两行。是不是很简单?

除了 `'w'` 和 `'a'`,其实还有 `'x'` 模式,这个模式有点“小心翼翼”。它也用于写入,但如果文件已经存在了,它会报一个 `FileExistsError` 错误,不会像 `'w'` 那样直接覆盖,也不会像 `'a'` 那样追加。它就是“君子坦荡荡”,只写新文件,不碰旧文件。在你希望确保自己正在创建一个全新的文件、防止意外覆盖现有文件时, `'x'` 模式就派上用场了。

“`python

尝试用 'x' 模式创建一个文件

try:

with open('new_exclusive_file.txt', 'x', encoding='utf-8') as f:

f.write("这是使用 'x' 模式创建并写入的内容。")

print("'new_exclusive_file.txt' 文件成功创建并写入。")

except FileExistsError:

print("'new_exclusive_file.txt' 文件已存在,无法使用 'x' 模式创建。")

如果你再运行一次上面的 try 块,就会捕获到 FileExistsError

“`

你看,加上 `try…except` 块,就能优雅地处理文件已存在的情况了。

到这里,我们说了怎么写入普通文本。那要是想一行一行地写呢?有时候你的数据是一条一条的列表,你想让每条数据都占一行。`write()` 方法只能写一个字符串,如果你把整个列表转成字符串写进去,那可就乱套了。别急,Python 想得很周到,还有一个 `writelines()` 方法。

`writelines()` 方法接收一个可迭代对象(比如列表),里面的每个元素都应该是一个字符串。它会把这些字符串依次写入文件,但记住,它不会自动给你换行!如果你想每写完一个元素就换行,你得自己在每个字符串末尾加上换行符 `\n`。

“`python

准备一些数据,每个元素代表一行

lines_to_write = [

"第一条数据:用户ID 123\n",

"第二条数据:产品名称 'Python教程'\n",

"第三条数据:订单金额 99.99\n"

]

使用 'w' 模式打开文件准备写入这些行

with open('data_lines.txt', 'w', encoding='utf-8') as f:

使用 writelines() 写入列表中的所有行

f.writelines(lines_to_write)

print("多行数据已写入 data_lines.txt 文件。")

“`

看清楚了,`lines_to_write` 列表里的每个字符串末尾都有个 `\n`。这样 `writelines()` 写入的时候,才会自动换行。如果没有 `\n`,它们就会被连成一行写进去。

除了写文本,我们可能还需要写入二进制数据,比如图片、音频或者其他非文本文件。这时候,打开文件的模式就得加上 `'b'`,变成 `'wb'` (write binary) 或者 `'ab'` (append binary)。在二进制模式下,你处理的数据就是字节(bytes),而不是字符串。写入的时候也要用 `write()` 方法,但传入的参数必须是 `bytes` 类型的数据。

“`python

假设我们有一些字节数据,比如一张图片的开头部分(这里只是示例)

真实的二进制数据需要从源文件读取或者生成

binary_data = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\nIDATx\x9cc\xfc\xff\xff?\x03\x00\x08\xfc\x02\xfe\xa7\xcd\x04\x00\x00\x00\x00IEND\xaeB`\x82'

使用 'wb' 模式打开文件

with open('example.bin', 'wb') as f:

写入字节数据

f.write(binary_data)

print("二进制数据已写入 example.bin 文件。")

“`

注意那个 `b` 前缀的字符串,那就是表示这是一个字节串(bytes literal)。在二进制模式下,不能直接写入普通的字符串,否则会报错。

再聊点深入点的。有时候文件特别大,你不想一次性把所有内容都加载到内存里再写。或者你的数据是动态生成的,比如一个流。这时候就可以分块写入。你可以反复调用 `write()` 方法,每次写一小部分数据。这在处理大文件或者网络数据流的时候特别有用。

“`python

模拟一个生成大数据的过程

def generate_large_data(chunk_size):

for i in range(10000): 生成大量数据

yield f"这是第 {i+1} 行数据,内容随便写长一点点…{'A' * 100}\n"

分块写入文件

file_path = 'large_file_example.txt'

chunk_size = 500 每次写入的行数

with open(file_path, 'w', encoding='utf-8') as f:

current_chunk = []

for line in generate_large_data(chunk_size):

current_chunk.append(line)

if len(current_chunk) >= chunk_size:

f.writelines(current_chunk)

current_chunk = [] 清空当前块,准备下一块

写入剩余的数据(如果不足一个chunk)

if current_chunk:

f.writelines(current_chunk)

print(f"大量数据已分块写入 {file_path} 文件。")

“`

上面这个例子虽然用 `writelines()` 写了一个 chunk 的数据,但核心思想是分批处理,而不是一次性生成或读取所有数据再写入。你可以写一个循环,每次读取一小块源数据,然后立即用 `write()` 或 `writelines()` 写入目标文件。这种方式对内存非常友好。

还有,你写文件的时候,除了直接写入内容,有时候还需要控制文件的位置。比如你想在文件中间某个位置插入内容,或者覆盖掉某个区域的数据。这就涉及到文件指针(file pointer)的概念。Python 里可以用 `seek()` 方法来移动文件指针,用 `tell()` 方法来获取当前文件指针的位置。

`seek(offset, whence)` 方法有两个参数:`offset` 是偏移量,`whence` 是参照点。`whence` 可以是:

* `0` (或 `io.SEEK_SET`):从文件开头算起。

* `1` (或 `io.SEEK_CUR`):从当前位置算起。

* `2` (或 `io.SEEK_END`):从文件末尾算起。

在文本模式下 (`'w'`, `'a'`, `'r'` 等不带 `'b'`) 使用 `seek` 和 `tell` 有点限制,因为不同的字符编码占用的字节数不一样,直接按字节偏移可能会出错。通常,在文本模式下,只能 `seek(0, 0)` (回到文件开头) 或者 `seek(offset, 0)`,并且 `offset` 必须是 `tell()` 返回的值。所以,如果你真的需要在文件中精确地跳来跳去并写入,最好使用二进制模式 (`'wb'`, `'ab'`, `'rb+'` 等)。

“`python

在二进制模式下操作文件指针并写入

file_path_binary = 'binary_seek_example.bin'

initial_data = b'abcdefghijklmnopqrstuvwxyz'

先用 'wb' 模式写入一些初始数据

with open(file_path_binary, 'wb') as f:

f.write(initial_data)

print(f"初始数据已写入 {file_path_binary} 文件。")

再用 'rb+' 模式打开,既可以读也可以写,且是二进制模式

'rb+' 模式打开文件时,文件指针默认在开头

with open(file_path_binary, 'rb+') as f:

print(f"当前文件指针位置 (开头): {f.tell()}") 应该输出 0

移动文件指针到第5个字节(索引为4,因为从0开始)

f.seek(4, 0) 从文件开头偏移4个字节

print(f"移动后文件指针位置: {f.tell()}") 应该输出 4

在当前位置写入一些字节,会覆盖掉原有数据

data_to_overwrite = b'123'

f.write(data_to_overwrite)

print(f"在位置 4 写入了 {data_to_overwrite},覆盖了原有数据。")

移动文件指针到文件末尾并追加内容

f.seek(0, 2) 从文件末尾偏移0个字节

print(f"移动到文件末尾后文件指针位置: {f.tell()}") 应该输出文件当前的总字节数

追加一些字节

data_to_append = b'XYZ'

f.write(data_to_append)

print(f"在文件末尾追加了 {data_to_append}。")

验证一下文件内容 (用 'rb' 模式读取)

with open(file_path_binary, 'rb') as f:

content = f.read()

print(f"文件最终内容 (bytes): {content}")

期望输出类似 b'abcd123ghijklmnopqrstuvwxyzXYZ'

“`

这个二进制模式下的 写入 和 `seek` 操作,在处理固定格式的文件或者需要修改文件中间部分内容时非常有用。比如修改一个文件头信息,或者更新数据库文件里的某个记录(如果文件结构是固定长度的)。

总而言之,python怎么写入 文件,看似简单,实际包含了多种模式和技巧。从最基本的 `'w'` 和 `'a'` 写文本,到处理二进制的 `'wb'` 和 `'ab'`,再到控制文件指针的 `seek()`。熟练掌握这些,你就能灵活地把你程序里的数据存到文件里,无论是简单的日志记录,还是复杂的数据持久化,甚至是对文件内容进行精细化修改。记住,始终使用 `with open(…)` 结构,并注意文件编码,这是确保你的文件操作安全、可靠、不乱码的关键。写文件这事儿,就是把你的想法和数据,从短暂的内存世界,搬进永恒的存储空间,让它们在那里安家落户,随时待命。挺有成就感的,不是吗?

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。