如何拆分大型CSV文件?及将分号分隔的单列CSV转为多列
Hey there! Let's tackle your two CSV-related questions one by one:
1. 如何拆分大型CSV文件?
拆分大型CSV文件的方法有很多,我给你推荐几种实用的方案,根据你的技术栈选择就行:
使用Python(适合熟悉代码的场景)
如果习惯用Python,两种方式都可以:
方案1:用Pandas分块读写
Pandas的read_csv支持按块读取,非常适合处理大文件,不会一次性把所有数据加载到内存:
import pandas as pd # 定义每个拆分后文件的行数,根据你的内存情况调整,比如设为10000 chunk_size = 10000 # 遍历每个数据块,保存为独立文件 for chunk_idx, chunk in enumerate(pd.read_csv('large_file.csv', chunksize=chunk_size)): chunk.to_csv(f'large_file_part_{chunk_idx + 1}.csv', index=False)
方案2:用原生CSV模块(更省内存)
如果文件超大,Pandas可能还是占内存,用Python原生的csv模块更轻量:
import csv chunk_size = 10000 current_part = 1 with open('large_file.csv', 'r') as infile: reader = csv.reader(infile) # 先读取表头 header = next(reader) # 初始化第一个输出文件 outfile = open(f'part_{current_part}.csv', 'w', newline='') writer = csv.writer(outfile) writer.writerow(header) row_counter = 0 for row in reader: writer.writerow(row) row_counter += 1 # 达到指定行数就切换到新文件 if row_counter == chunk_size: current_part += 1 outfile.close() outfile = open(f'part_{current_part}.csv', 'w', newline='') writer = csv.writer(outfile) writer.writerow(header) row_counter = 0 outfile.close()
使用命令行工具(适合快速操作)
如果不想写代码,用系统自带的命令行工具更高效:
Linux/macOS(用split命令)
# 按行数拆分,每个文件10000行,输出文件前缀为part_ split -l 10000 large_file.csv part_ # 如果需要保留表头,先提取表头,再拆分数据行,最后合并表头到每个小文件 head -n 1 large_file.csv > header.csv tail -n +2 large_file.csv | split -l 10000 - part_ for file in part_*; do cat header.csv "$file" > temp && mv temp "$file"; done
Windows(用PowerShell)
# 先读取表头 $header = Get-Content 'large_file.csv' -TotalCount 1 # 读取所有数据行(跳过表头) $rows = Get-Content 'large_file.csv' | Select-Object -Skip 1 # 定义每个文件的行数 $chunkSize = 10000 $counter = 1 # 循环拆分并保存 for ($i=0; $i -lt $rows.Count; $i+=$chunkSize) { $header + $rows[$i..($i+$chunkSize-1)] | Out-File "part_$counter.csv" $counter++ }
2. 拆分单列CSV为多列(分号分隔数据)
看你给出的数据示例,这个文件本质是分号分隔的CSV,只是被当成单列加载了,有两种简单的处理方式:
方法1:读取时直接指定分隔符
最直接的方式是在读取Pandas DataFrame时,就告诉它分隔符是分号:
import pandas as pd # 直接用sep=';'读取,Pandas会自动拆分列 df = pd.read_csv('your_single_column.csv', sep=';')
这样处理后,你的数据会自动分成insert_date、currency_from、currency_to、currency_value四个独立列。
方法2:已加载的DataFrame拆分单列
如果已经把数据加载成单列的DataFrame了,可以用str.split方法展开:
import pandas as pd # 假设已加载的单列DataFrame叫df,列名是那串分号分隔的表头 df = pd.read_csv('your_single_column.csv') # 提取表头(从第一列的列名拆分) header = df.columns[0].split(';') # 拆分每行数据,展开成多列 df = df.iloc[:, 0].str.split(';', expand=True) # 设置列名 df.columns = header
备选:用CSV模块预处理
如果文件很大,用原生CSV模块先拆分再读取更高效:
import csv # 先把分号分隔的内容转成标准CSV with open('your_single_column.csv', 'r') as infile, open('split_result.csv', 'w', newline='') as outfile: reader = csv.reader(infile, delimiter=';') writer = csv.writer(outfile) for row in reader: writer.writerow(row) # 再用Pandas读取处理后的文件 df = pd.read_csv('split_result.csv')
内容的提问来源于stack exchange,提问作者Clayton Marquardt




