Python新手提问:如何同时写多个文件的实现方法

Python 新手。
最近遇到一个问题,大概是从一个很大很大的文件中匹配出一堆记录,然后按照规则写入不同的文件里。之前的实现方法是逐条写,但是效率实在是非常感人,想问下有没有更高效的方法。谢谢。
Python新手提问:如何同时写多个文件的实现方法

17 回复

找一个异步文件 io 的库


要同时写多个文件,最直接的方法是使用循环遍历文件列表,对每个文件分别执行写入操作。这里给你几种常见场景的实现方法:

1. 写入相同内容到多个文件

# 要写入的内容
content = "这是要写入的内容\n第二行内容"

# 文件路径列表
file_paths = ['file1.txt', 'file2.txt', 'file3.txt']

# 使用循环逐个写入
for file_path in file_paths:
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(content)

2. 写入不同内容到多个文件

# 文件路径和对应内容的字典
files_content = {
    'data1.txt': '这是第一个文件的内容',
    'data2.txt': '这是第二个文件的内容',
    'data3.txt': '这是第三个文件的内容'
}

# 遍历字典写入
for file_path, content in files_content.items():
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(content)

3. 批量处理数据并写入不同文件

# 假设有一组数据要分别保存
data_list = [
    {'filename': 'user1.txt', 'data': '用户1的信息'},
    {'filename': 'user2.txt', 'data': '用户2的信息'},
    {'filename': 'user3.txt', 'data': '用户3的信息'}
]

for item in data_list:
    with open(item['filename'], 'w', encoding='utf-8') as f:
        f.write(item['data'])

关键点说明:

  • 使用 with open() as f: 可以自动管理文件资源,避免忘记关闭文件
  • 'w' 模式会覆盖原有内容,如果需要追加内容使用 'a' 模式
  • 指定 encoding='utf-8' 可以避免中文编码问题

简单建议: 根据数据组织形式选择合适的循环结构来批量写入文件。

把写的数据缓存到多个 [],用多进程在子进程里面写

IO 操作类型的,用多线程就好

楼上的方法是通过操作系统的异步进行解决,如果想要屏蔽这些操作系统的细节去实现可以用 celery,通过引入任务队列进行任务分发管理,但是弊端是引入了一个新的组件

multiprocessing 库即可,一个进程负责读大文件、把匹配的数据写到多个对应的 queue 中……各个规则可以分别搞个子进程,读取对应的队列,专门写自己的文件(这种方式适合规则不太多的情况,如果太多,进程要开少一点)

先把代码贴出来, 看看是不是你的写法有问题?

要是在循环中读写文件那肯定慢啊

目前是要写好几十个文件
我去看看 thx

多线程啊,IO 密集型,多线程最优

我可能会用 gevent 写多进程

多线程或者 async

多线程,一个线程读取,用个队列传递任务给其他线程,也不用担心读写冲突问题
毕竟官方 py GIL 保证了多线程就是单线程


py 的多线程并非是线程安全的。因为解释出来的字节码顺序是不确定的,也就是线程 a 的操作到一半,线程 b 有可能同样也进入相同的代码了,线程的共享数据会被破坏掉。


你没有理解 GIL

IO 是释放 GIL 锁的

生产者 /消费者模型学过吗?

一楼 +1,比如 aiofiles [1] 这个库用了并发线程池,默认是 asyncio loop 自带的默认线程池。

如果只需要异步 io 就上多进程 multiprocessing,开销大也没必要,还增加复杂度,async 多线程够了。
要是不好引入新依赖的话,run_in_executor[2]了解下,让 io 密集操作进入线程池执行,不阻塞其他逻辑。以及 asyncio.create_task[3] 或 asyncio.gather[4]。

但是关键 io 代码无论如何都要自行同步管理好,否则会写坏数据,正如 提到 py 的多线程不安全

[1] https://github.com/Tinche/aiofiles
[2] https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor
[3] https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task
[4] https://docs.python.org/3/library/asyncio-task.html#asyncio.gather

回到顶部