Python数据转换实战:从TXT到CSV的3种高效方法

在数据分析的日常工作中,我们经常遇到需要将简单的文本文件转换为结构化CSV格式的场景。无论是从实验设备导出的原始数据,还是网络爬虫抓取的初始结果,TXT文件往往是数据旅程的第一站。本文将深入探讨三种不同复杂度的转换方法,特别适合Python初学者和需要快速处理数据转换任务的分析师。

1. 基础转换:使用标准csv模块

对于格式规整的TXT文件,Python内置的csv模块是最轻量级的解决方案。这种方法不依赖任何第三方库,适合在资源受限的环境中快速处理数据。

假设我们有一个简单的data.txt文件,内容如下:

1 2 3
4 5 6
7 8 9

对应的转换代码如下:

import csv

def txt_to_csv_basic(txt_path, csv_path, delimiter=' '):
    with open(txt_path, 'r') as txt_file:
        lines = [line.strip().split(delimiter) for line in txt_file]
    
    with open(csv_path, 'w', newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerows(lines)
    print(f"转换完成,结果保存在 {csv_path}")

# 使用示例
txt_to_csv_basic('data.txt', 'output_basic.csv')

关键参数说明:

  • delimiter:指定TXT文件中的分隔符,默认为空格
  • newline='':防止CSV文件中出现空行
  • writerows:一次性写入多行数据,比逐行写入更高效

提示:对于大型文件,建议逐行读取和处理,而不是一次性读取所有内容到内存中。

2. 进阶处理:pandas的灵活应用

当面对格式复杂或需要数据清洗的TXT文件时,pandas库提供了更强大的处理能力。pandas不仅能处理各种分隔符,还能自动处理缺失值、数据类型转换等常见问题。

2.1 基本转换

import pandas as pd

def txt_to_csv_pandas(txt_path, csv_path, sep=None):
    # sep=None表示自动检测分隔符
    df = pd.read_csv(txt_path, sep=sep, header=None)
    df.to_csv(csv_path, index=False, header=False)
    print(f"Pandas转换完成,结果保存在 {csv_path}")

# 使用示例
txt_to_csv_pandas('data.txt', 'output_pandas.csv')

2.2 处理复杂格式

pandas的read_csv函数支持数十种参数配置,可以应对各种复杂情况:

# 处理带有混合分隔符和缺失值的文件
df = pd.read_csv('complex_data.txt', 
                 sep='\s+',  # 匹配任意空白字符
                 na_values=['NA', 'null'],  # 自定义缺失值标识
                 dtype={0: int, 1: float})  # 指定列数据类型

pandas转换性能对比

方法代码复杂度处理速度内存占用功能丰富度
csv模块低快低基础
pandas基础中中中丰富
pandas高级高慢高非常丰富

3. 高效批处理:处理大型文件的技巧

当处理GB级别的大型TXT文件时,内存优化变得至关重要。以下是几种实用的优化策略:

3.1 分块读取与处理

# 分块读取大型文件
chunk_size = 100000  # 每次处理10万行
chunks = pd.read_csv('large_data.txt', sep='\t', chunksize=chunk_size)

for i, chunk in enumerate(chunks):
    chunk.to_csv(f'output_chunk_{i}.csv', index=False)
    print(f"已处理第 {i+1} 个分块")

3.2 使用dtype优化内存

# 指定列数据类型以减少内存占用
dtype_dict = {
    'user_id': 'int32',
    'price': 'float32',
    'category': 'category'  # 对低基数文本列特别有效
}
df = pd.read_csv('large_data.txt', dtype=dtype_dict)

3.3 并行处理技术

对于多核CPU环境,可以使用dask或modin库实现并行处理:

import dask.dataframe as dd

# 创建dask dataframe
ddf = dd.read_csv('very_large_data.txt', sep='\t')
# 执行计算并保存结果
ddf.to_csv('output_*.csv', index=False)

4. 实战案例:真实场景数据转换

让我们看一个更接近真实场景的例子,处理一个包含混合数据类型和异常值的TXT文件:

原始数据 (sales_data.txt):

日期      产品ID  销售额  区域
20230101 P-1001 1500.5 华东
20230102 P-1002 NA     华南
20230103 P-1003 800.0  华北
20230104 P-1004 1200   华东
20230105 P-1005 950.75 

处理代码:

def clean_sales_data(txt_path, csv_path):
    # 自定义转换函数
    def parse_date(date_str):
        return pd.to_datetime(date_str, format='%Y%m%d')
    
    # 读取并清洗数据
    df = pd.read_csv(txt_path, sep='\s+', skiprows=1,  # 跳过标题行
                     names=['date', 'product_id', 'sales', 'region'],
                     converters={'date': parse_date},
                     na_values=['NA', ''])
    
    # 数据清洗
    df['sales'] = pd.to_numeric(df['sales'], errors='coerce')
    df['region'] = df['region'].fillna('未知')
    
    # 保存结果
    df.to_csv(csv_path, index=False, encoding='utf-8-sig')
    print(f"数据清洗完成,结果保存在 {csv_path}")

clean_sales_data('sales_data.txt', 'cleaned_sales.csv')

常见问题解决方案:

  1. 编码问题:

    • 使用encoding='utf-8'或encoding='gbk'参数处理中文
    • 对于混合编码文件,可以尝试chardet库自动检测编码
  2. 不规则分隔符:

    • 使用正则表达式作为分隔符,如sep='\s+'匹配任意空白字符
    • 对于固定宽度文件,使用pd.read_fwf()
  3. 性能优化:

    • 禁用不需要的功能:engine='c', low_memory=False
    • 仅读取需要的列:usecols=['col1', 'col2']

在实际项目中,我发现最常遇到的坑是编码问题和数据类型自动推断错误。特别是在处理大型文件时,提前指定dtype参数可以节省大量内存和处理时间。另一个实用技巧是使用pd.read_csv的nrows参数先读取前1000行检查数据结构,再决定完整的读取策略。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐