怎么用脚本转换分隔符文本(CSV/TSV/自定义分隔符全攻略)
目录导读
- 什么是分隔符文本 – 初识CSV、TSV与自定义分隔符
- 为什么需要脚本转换分隔符 – 跨系统数据兼容、清洗与迁移
- 脚本转换的三种主流方案
- Bash(Linux/macOS)
- Python(跨平台灵活方案)
- PowerShell(Windows原生)
- 实战案例:从逗号分隔到制表符分隔
- 常见问答(FAQ)
- 脚本转换中的坑与避坑指南
- 总结与效率提升建议
什么是分隔符文本
分隔符文本,指用特定字符(如逗号、制表符、竖线、分号)将数据字段隔开的纯文本文件,最常见的是:

- CSV(逗号分隔值):使用逗号
- TSV(制表符分隔值):使用制表符
\t - PSV(管道符分隔值):使用竖线
实际工作中,不同系统会输出不同格式:Excel 默认用逗号,某些数据库导出用制表符,而老旧系统可能用分号。“怎么用脚本转换分隔符文本”就成了数据工程师的必修课。
为什么需要脚本转换分隔符
- 跨系统兼容:A 系统输出 CSV,B 系统只认 TSV。
- 数据清洗:原本用逗号,但字段内含逗号导致错列,需改为更安全的制表符。
- 批量处理:手动打开几百个文件转换?脚本一行搞定。
- 自动化流水线:在 ETL 流程中,脚本转换是常见环节。
脚本转换的三种主流方案
1 Bash 方案(Linux/macOS)
适用于类 Unix 环境,轻量无需安装额外工具。
# 将 CSV 转为 TSV(用 sed 将逗号替换为制表符) sed 's/,/\t/g' input.csv > output.tsv # 更严谨的版本:考虑引号内逗号(需用 csvkit 或 awk 处理) # 安装 csvkit 后: csvformat -D $'\t' input.csv > output.tsv
注意事项:简单 sed 会误替换引号内的逗号,导致数据错乱,建议用 csvkit 或 awk 处理复杂场景。
2 Python 方案(跨平台通用)
Python 拥有最灵活的标准库 csv,且内置处理引号内逗号、换行符的逻辑。
#!/usr/bin/env python3
import csv
import sys
# 用法: python csv_to_tsv.py input.csv output.tsv
input_file = sys.argv[1]
output_file = sys.argv[2]
with open(input_file, 'r', newline='', encoding='utf-8') as inf:
reader = csv.reader(inf)
with open(output_file, 'w', newline='', encoding='utf-8') as outf:
writer = csv.writer(outf, delimiter='\t')
for row in reader:
writer.writerow(row)
print("转换完成!")
优势:自动处理引号、换行、编码,适用于任意分隔符(csv.reader 支持自定义 delimiter)。
3 PowerShell 方案(Windows 原生)
# Import-Csv 自动解析 CSV,Export-Csv 指定分隔符 $data = Import-Csv "input.csv" $data | Export-Csv "output.tsv" -Delimiter "`t" -NoTypeInformation
注意:PowerShell 的 Import-Csv 默认使用逗号,-Delimiter 参数可改为分号或制表符。
实战案例:从逗号分隔到制表符分隔
场景:你有一个老旧的 employees.csv,字段含逗号(如地址:"北京市,朝阳区"),直接替换会损坏数据。
正确脚本(Python 版):
import csv
import sys
def convert_delimiter(input_path, output_path, input_delim=',', output_delim='\t'):
with open(input_path, 'r', newline='', encoding='utf-8') as inf:
reader = csv.reader(inf, delimiter=input_delim)
with open(output_path, 'w', newline='', encoding='utf-8') as outf:
writer = csv.writer(outf, delimiter=output_delim)
for row in reader:
writer.writerow(row)
if __name__ == "__main__":
# 用法:python convert.py in.csv out.tsv
convert_delimiter(sys.argv[1], sys.argv[2])
验证结果:
- 原 CSV 行:
1001,张三,"北京市,朝阳区",技术部 - 转换后 TSV 行:
1001\t张三\t北京市,朝阳区\t技术部(引号被保留或移除取决于 Python 版本,但字段正确)
常见问答(FAQ)
Q1:脚本转换会破坏数据编码吗?
答:会,建议在脚本中明确定义编码(如 utf-8、gbk),若不指定,Windows 默认可能用 gbk,Linux 用 utf-8,导致乱码,Python 脚本中加上 encoding='utf-8-sig' 可以兼容 BOM。
Q2:分隔符出现在字段内部怎么办?
答:这是最易踩的坑,Python 的 csv.reader 默认处理引号包裹的字段,可放心使用,而 sed 's/,/\t/g' 会误替换。复杂数据一定用 Python 或 csvkit。
Q3:可以批量转换目录下所有 CSV 吗?
答:可以,Bash 中 for f in *.csv; do ... done;Python 中 os.listdir + glob。
Q4:转换后字段顺序变了或乱序了,怎么办?
答:除非你操作了字典(csv.DictReader),否则 csv.reader 按行顺序读取,不会改变列顺序,若出现乱序,通常是因为源文件本身包含 BOM 或换行符异常。
脚本转换中的坑与避坑指南
| 常见问题 | 解决方法 |
|---|---|
| 逗号在引号内被替换 | 使用 Python csv.reader,不用文本替换 |
| 文件编码混乱(中文乱码) | 统一用 utf-8-sig 读取,指定输出编码 |
| 空行或换行符被吞 | open(newline='') 参数防止 Python 自动转义 |
Windows 换行符 \r\n 与 Unix 不兼容 |
用 newline='' 控制,或 dos2unix 预处理 |
| 超大文件(GB 级)内存溢出 | 使用 csv.reader 逐行迭代,不用一次性 readlines |
总结与效率提升建议
“怎么用脚本转换分隔符文本”这个问题,答案不是简单的“替换字符”,而是围绕数据完整性、编码、跨平台兼容性的系统方案。
推荐方案优先级:
- 普通场景:Python
csv库(最佳兼容性) - Linux 快速操作:
csvkit的csvformat - Windows 环境:PowerShell
Import-Csv+Export-Csv - 避免使用:纯文本替换工具(
sed、awk)处理含引号的数据
效率技巧:
- 创建一次脚本,保存为
convert_delim.py,之后只需修改参数。 - 在脚本中加入
argparse参数解析,实现交互式选择分隔符。 - 结合
glob批量处理,加上tqdm进度条。
掌握脚本转换分隔符,等于掌握了数据流通的钥匙,下次遇到 .psv、.ssv、.prn 等奇怪格式,你也可以轻松应对。
延伸阅读:如果你需要更高级的功能(如自动检测分隔符、字段数据类型推断),可以研究 pandas.read_csv() 或 csv-sniffer 库,它们能自动嗅探分隔符。