Python中如何实现将数据保存为多个文本文件,每个文件仅保存1万行数据?

将服务器返回的数据保存到本地文本,需要实现的功能如标题:,自动命名文本文件:save1,save2···
Python中如何实现将数据保存为多个文本文件,每个文件仅保存1万行数据?

9 回复

一个变量 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')

这个方案的核心是:按行计数切换文件句柄。要点:

  1. 流式处理:使用生成器避免内存爆炸,适合大文件
  2. 自动命名:文件按data_part_001.txt格式顺序命名
  3. 异常安全:用try-finally确保文件正确关闭
  4. 灵活数据源:适配列表、文件、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 机器···

你需要的是 file rotation,可以谷歌一下 python 里的 rotatingfilehandler, 参考一下它们标准库里的实现。

回到顶部