Python中如何实现将数据保存为多个文本文件,每个文件仅保存1万行数据?
将服务器返回的数据保存到本地文本,需要实现的功能如标题:,自动命名文本文件:save1,save2···
Python中如何实现将数据保存为多个文本文件,每个文件仅保存1万行数据?
一个变量 count 计数<br>name = 0<br>for i in data:<br> if count == 10000:<br> count = 0<br> name += 1<br> file_object = open('save%d.txt'%name, 'w+')<br> file_object.write(i)<br> file_object.close( )<br>
import os
def split_data_to_files(data, lines_per_file=10000, output_dir='output'):
"""
将数据分割保存为多个文本文件
Args:
data: 可迭代的数据源(列表、生成器等)
lines_per_file: 每个文件保存的行数
output_dir: 输出目录
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
file_count = 0
line_count = 0
current_file = None
try:
for i, line in enumerate(data, 1):
# 每10000行创建一个新文件
if line_count % lines_per_file == 0:
if current_file:
current_file.close()
file_count += 1
filename = f"data_part_{file_count:03d}.txt"
filepath = os.path.join(output_dir, filename)
current_file = open(filepath, 'w', encoding='utf-8')
# 写入数据行
current_file.write(str(line))
if not str(line).endswith('\n'):
current_file.write('\n')
line_count += 1
# 可选:显示进度
if i % 1000 == 0:
print(f"已处理 {i} 行,当前文件: data_part_{file_count:03d}.txt")
finally:
# 确保最后一个文件被关闭
if current_file:
current_file.close()
print(f"分割完成!共生成 {file_count} 个文件,总行数: {line_count}")
return file_count
# 使用示例1:从列表数据分割
def example_from_list():
# 生成示例数据(这里用数字模拟)
sample_data = [f"这是第 {i} 行数据\n" for i in range(1, 25001)]
# 分割保存
split_data_to_files(sample_data, lines_per_file=10000, output_dir='split_output')
# 使用示例2:从大文件流式读取并分割
def example_from_large_file(input_file='large_data.txt'):
def file_line_generator():
with open(input_file, 'r', encoding='utf-8') as f:
for line in f:
yield line
split_data_to_files(file_line_generator(), output_dir='file_split_output')
# 使用示例3:处理CSV数据
def example_from_csv(csv_file='data.csv'):
import csv
def csv_row_generator():
with open(csv_file, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
# 将CSV行转换为字符串(用逗号连接)
yield ','.join(row)
split_data_to_files(csv_row_generator(), output_dir='csv_split_output')
# 运行示例
if __name__ == "__main__":
# 示例1:从列表数据
example_from_list()
# 如果需要从文件读取,取消注释下面两行:
# example_from_large_file('your_large_file.txt')
# example_from_csv('your_data.csv')
这个方案的核心是:按行计数切换文件句柄。要点:
- 流式处理:使用生成器避免内存爆炸,适合大文件
- 自动命名:文件按
data_part_001.txt格式顺序命名 - 异常安全:用
try-finally确保文件正确关闭 - 灵活数据源:适配列表、文件、CSV等各种输入
用的时候注意数据换行符,如果原数据没换行,代码会自动补上。
一句话建议:记得处理完数据后检查最后一个文件的行数是否完整。
man split, 不谢
非常感谢提供的思路和代码,我在实际代码中遇到了一个问题:服务器返回的数据长短不一,当存储数据足够 10000 时,才保存为文本,命名为 save1,当存储足够第二个 10000 时,才保存为 save2,如何才能保证检测到这一变化?
😆谢谢,如何检测服务器返回的数据长度呢,要保证这一长度足够才划分文件
data = []
while True:
r = receive()
data.extend(r.splitlines())
if len(data) >= 10000:
save(data[:10000])
data = data[10000:]
windows 机器···
cygwin
你需要的是 file rotation,可以谷歌一下 python 里的 rotatingfilehandler, 参考一下它们标准库里的实现。

