Python实战:3种高效方法将TXT转CSV(附完整代码)
Python实战:3种高效方法将TXT转CSV(附完整代码)
在日常数据处理工作中,我们经常需要将文本文件(TXT)转换为更结构化的CSV格式。无论是处理日志文件、数据采集结果还是简单的数据交换,这种转换都是数据分析师和开发者的基本功。本文将介绍三种高效实用的Python方法,帮助你在不同场景下快速完成转换任务。
1. 基础文件操作法:纯Python实现
对于简单的TXT文件转换需求,使用Python内置的文件操作功能就能轻松搞定。这种方法不依赖任何第三方库,适合轻量级数据处理场景。
# 读取文本文件内容并输出到CSV文件 with open('data.txt', 'r') as input_file, open('data.csv', 'w', newline='') as output_file: for line in input_file: # 假设txt文件中的字段由逗号和空格分隔 fields = line.strip().split(', ') # 将字段以逗号分隔写入csv文件 output_file.write(','.join(fields) + '\n')关键参数说明:
newline='':确保在不同操作系统上正确处理换行符strip():去除每行首尾的空白字符split(', '):按指定分隔符拆分字段
注意:这种方法假设TXT文件已经使用固定分隔符(如逗号)组织数据。如果分隔符不统一,需要先进行数据清洗。
2. 标准库解决方案:csv模块详解
Python内置的csv模块提供了更专业的CSV文件处理能力,特别适合处理复杂格式的文本数据。
2.1 基本读写操作
import csv with open('data.txt', 'r') as input_file, open('data.csv', 'w', newline='') as output_file: csv_reader = csv.reader(input_file) csv_writer = csv.writer(output_file) for row in csv_reader: csv_writer.writerow(row)2.2 处理带表头的数据
当TXT文件包含列名时,使用DictReader/DictWriter能更好地处理字段映射:
import csv with open('data_with_header.txt', 'r') as input_file: csv_reader = csv.DictReader(input_file) data = [row for row in csv_reader] with open('output.csv', 'w', newline='') as output_file: fieldnames = data[0].keys() if data else [] csv_writer = csv.DictWriter(output_file, fieldnames=fieldnames) csv_writer.writeheader() csv_writer.writerows(data)csv模块优势对比:
| 特性 | 基础文件操作 | csv模块 |
|---|---|---|
| 自动处理引号 | ❌ | ✅ |
| 支持不同分隔符 | 需手动处理 | 内置支持 |
| 处理空值 | 需手动处理 | 自动处理 |
| 性能 | 较快 | 稍慢 |
| 代码复杂度 | 低 | 中等 |
3. 数据分析利器:pandas高级转换
对于大型数据集或需要复杂转换的场景,pandas库提供了最强大的解决方案。
3.1 基本转换
import pandas as pd # 读取TXT文件 df = pd.read_csv('data.txt', delimiter=', ') # 写入CSV文件 df.to_csv('output.csv', index=False)3.2 处理复杂格式
pandas可以轻松应对各种复杂情况:
# 处理不规则分隔符 df = pd.read_csv('irregular_data.txt', sep='\s*,\s*', engine='python') # 处理缺失值 df = pd.read_csv('data_with_missing.txt', na_values=['NA', 'null']) # 指定列数据类型 df = pd.read_csv('data.txt', dtype={'Age': 'int32', 'Salary': 'float64'}) # 保存时控制精度 df.to_csv('output.csv', float_format='%.2f', encoding='utf-8')pandas性能优化技巧:
- 使用
chunksize参数处理大文件:
chunk_iter = pd.read_csv('large_data.txt', chunksize=10000) for chunk in chunk_iter: process(chunk)- 指定
dtype减少内存占用:
dtypes = {'id': 'int32', 'price': 'float32'} df = pd.read_csv('data.txt', dtype=dtypes)- 只读取需要的列:
usecols = ['name', 'date', 'value'] df = pd.read_csv('data.txt', usecols=usecols)4. 实战场景解决方案
4.1 日志文件转换
处理服务器日志时,常需要将半结构化文本转为CSV:
import re import pandas as pd log_pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (\w+) (.*)' logs = [] with open('server.log', 'r') as f: for line in f: match = re.match(log_pattern, line) if match: logs.append({ 'date': match.group(1), 'time': match.group(2), 'level': match.group(3), 'message': match.group(4) }) pd.DataFrame(logs).to_csv('log_analysis.csv', index=False)4.2 处理多分隔符数据
当数据中存在多种分隔符时,可以先用正则表达式统一处理:
import re def clean_line(line): # 将各种空白符统一替换为逗号 return re.sub(r'[\s,;|]+', ',', line.strip()) with open('messy_data.txt', 'r') as infile, open('clean_data.csv', 'w') as outfile: for line in infile: outfile.write(clean_line(line) + '\n')4.3 处理大型文件的内存优化
对于超大文件,可以使用生成器逐行处理:
import csv def process_large_file(input_path, output_path): with open(input_path, 'r') as infile, open(output_path, 'w', newline='') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 处理表头 headers = next(reader) writer.writerow([h.strip() for h in headers]) # 逐行处理数据 for row in reader: processed_row = [field.strip() for field in row] writer.writerow(processed_row) process_large_file('huge_data.txt', 'huge_output.csv')