专业编程基础技术教程

网站首页 > 基础教程 正文

在 Python 中将列表写入文件:完整指南

ccvgpt 2025-03-19 10:59:13 基础教程 2 ℃

将列表写入文件是 Python 中的一项常见任务,无论您是保存数据以备后用、创建日志还是准备数据供其他程序使用。让我们探索实现此目的的不同方法,并提供您可以立即使用的清晰示例。

在 Python 中将列表写入文件:完整指南

基本文本文件编写

将列表写入文件的最简单方法是逐行以纯文本形式写入:

def write_list_to_text(filename, data):
    """
    Write each list item to a new line in a text file.
    
    Args:
        filename (str): Name of the file to write to
        data (list): List of items to write
    """
    with open(filename, 'w') as file:
        for item in data:
            file.write(str(item) + '\n')

# Example usage
fruits = ['apple', 'banana', 'orange', 'mango']
write_list_to_text('fruits.txt', fruits)

# Reading it back to verify
with open('fruits.txt', 'r') as file:
    print(file.read())

此方法非常适合在以下情况下:
- 您需要一种人类可读的格式
- 您的数据很简单(字符串或数字)
- 您想使用任何文本编辑器读取文件

使用 join() 获得更好的性能

对于较大的列表,使用 'join()' 比逐行编写更有效:

def write_list_efficient(filename, data):
    """
    Write a list to a file using join() for better performance.
    
    Args:
        filename (str): Name of the file to write to
        data (list): List of items to write
    """
    # Convert all items to strings and join with newlines
    content = '\n'.join(str(item) for item in data)
    
    with open(filename, 'w') as file:
        file.write(content)

# Example with a larger list
numbers = list(range(1, 1001))  # Create list of numbers 1-1000
write_list_efficient('numbers.txt', numbers)

# Verify first few lines
with open('numbers.txt', 'r') as file:
    print("First 5 lines:")
    for _ in range(5):
        print(file.readline().strip())

编写 CSV 文件

当数据具有结构时,CSV 文件是一个不错的选择:

import csv

def write_structured_list(filename, data, headers=None):
    """
    Write a list of lists or dictionaries to a CSV file.
    
    Args:
        filename (str): Name of the CSV file to write
        data (list): List of lists or dictionaries
        headers (list): Optional list of column headers
    """
    with open(filename, 'w', newline='') as file:
        if headers:
            writer = csv.DictWriter(file, fieldnames=headers)
            writer.writeheader()
            # Convert lists to dictionaries if needed
            if not isinstance(data[0], dict):
                data = [dict(zip(headers, row)) for row in data]
            writer.writerows(data)
        else:
            writer = csv.writer(file)
            writer.writerows(data)

# Example with student data
students = [
    ['Alice', 85, 'A'],
    ['Bob', 72, 'B'],
    ['Charlie', 90, 'A+'],
    ['Diana', 88, 'A']
]

headers = ['Name', 'Score', 'Grade']
write_structured_list('students.csv', students, headers)

# Example with dictionary data
student_dicts = [
    {'Name': 'Alice', 'Score': 85, 'Grade': 'A'},
    {'Name': 'Bob', 'Score': 72, 'Grade': 'B'},
    {'Name': 'Charlie', 'Score': 90, 'Grade': 'A+'},
    {'Name': 'Diana', 'Score': 88, 'Grade': 'A'}
]

write_structured_list('students_dict.csv', student_dicts, headers)

复杂数据的 JSON 格式

当您的列表包含嵌套结构或混合数据类型时,JSON 是最佳选择:

import json

def write_complex_list(filename, data, pretty=True):
    """
    Write a complex list structure to a JSON file.
    
    Args:
        filename (str): Name of the JSON file to write
        data (list): List containing nested structures
        pretty (bool): Whether to format the JSON for readability
    """
    with open(filename, 'w') as file:
        if pretty:
            json.dump(data, file, indent=2)
        else:
            json.dump(data, file)

# Example with complex data structure
users = [
    {
        'name': 'Alice',
        'scores': [85, 92, 88],
        'contact': {
            'email': 'alice@example.com',
            'phone': '123-456-7890'
        },
        'active': True
    },
    {
        'name': 'Bob',
        'scores': [72, 85, 80],
        'contact': {
            'email': 'bob@example.com',
            'phone': '098-765-4321'
        },
        'active': False
    }
]

write_complex_list('users.json', users)

# Reading back and printing first user's scores
with open('users.json', 'r') as file:
    data = json.load(file)
    print(f"First user's scores: {data[0]['scores']}")

处理带有 Chunk 的大型列表

当处理非常大的列表时,最好以块的形式写入以管理内存使用情况:

def write_large_list(filename, data_iterator, chunk_size=1000):
    """
    Write a large list to a file in chunks.
    
    Args:
        filename (str): Name of the file to write
        data_iterator: Iterator or generator providing the data
        chunk_size (int): Number of items to write at once
    """
    chunk = []
    with open(filename, 'w') as file:
        for item in data_iterator:
            chunk.append(str(item))
            
            if len(chunk) >= chunk_size:
                file.write('\n'.join(chunk) + '\n')
                chunk = []
        
        # Write any remaining items
        if chunk:
            file.write('\n'.join(chunk))

# Example using a generator for memory efficiency
def number_generator(start, end):
    for i in range(start, end):
        yield i

# Write numbers from 1 to 1 million
write_large_list('large_numbers.txt', number_generator(1, 1_000_001))

# Check file size and first few lines
import os

file_size = os.path.getsize('large_numbers.txt') / (1024 * 1024)  # Size in MB
print(f"File size: {file_size:.2f} MB")

with open('large_numbers.txt', 'r') as file:
    print("\nFirst 5 numbers:")
    for _ in range(5):
        print(file.readline().strip())

实际示例:日志处理

下面是一个实际示例,该示例处理日志条目并根据其严重性将其写入不同的文件:

import datetime
from pathlib import Path

class LogProcessor:
    def __init__(self, output_dir):
        self.output_dir = Path(output_dir)
        self.output_dir.mkdir(exist_ok=True)
        
        # Initialize files for different log levels
        self.files = {
            'ERROR': open(self.output_dir / 'errors.log', 'w'),
            'WARNING': open(self.output_dir / 'warnings.log', 'w'),
            'INFO': open(self.output_dir / 'info.log', 'w')
        }
    
    def process_logs(self, log_entries):
        """Process and sort log entries by severity."""
        try:
            for entry in log_entries:
                timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                level = entry['level']
                message = entry['message']
                
                if level in self.files:
                    self.files[level].write(f"[{timestamp}] {message}\n")
                    self.files[level].flush()  # Ensure immediate writing
        
        except Exception as e:
            print(f"Error processing logs: {e}")
        
    def close(self):
        """Close all open file handles."""
        for file in self.files.values():
            file.close()

# Example usage
log_entries = [
    {'level': 'INFO', 'message': 'Application started'},
    {'level': 'WARNING', 'message': 'High memory usage detected'},
    {'level': 'ERROR', 'message': 'Database connection failed'},
    {'level': 'INFO', 'message': 'Processing user request'},
    {'level': 'ERROR', 'message': 'Invalid user input'}
]

# Process the logs
processor = LogProcessor('logs')
processor.process_logs(log_entries)
processor.close()

# Verify the output
for level in ['ERROR', 'WARNING', 'INFO']:
    print(f"\nContents of {level.lower()}.log:")
    with open(f'logs/{level.lower()}.log', 'r') as file:
        print(file.read())

结论

根据您的需求选择您的方法:
- 对基本列表使用简单的文本文件
- 为结构化的表格数据选择 CSV
- 为复杂的嵌套数据选择 JSON
- 为非常大的列表实现分块

请记得:
- 始终使用上下文管理器('with' 语句)来处理文件
- 在写入之前将非字符串数据转换为字符串
- 考虑大型数据集的内存使用情况
- 适当处理异常
- 完成后关闭文件句柄

这些示例应该为您在 Python 项目中将列表写入文件打下坚实的基础。

最近发表
标签列表