使用Python脚本去除CSV文件重复行并更新原文件
没问题!要直接在原myfile.csv文件上去除重复行、不生成额外文件的话,这里有几个实用的方案,你可以根据自己的操作系统和需求选:
方法1:Python脚本(跨平台,保留原始行顺序)
这个方案在Windows、Linux、macOS上都能用,而且会保留每行第一次出现的顺序,适合大多数场景:
# 先读取文件内容,筛选出不重复的行 seen = set() unique_lines = [] # 打开文件读取,注意编码如果不是utf-8可以调整成对应的,比如gbk with open('myfile.csv', 'r', encoding='utf-8') as f: for line in f: # 去掉换行符后判断重复,避免因为换行符格式差异误判 stripped_line = line.rstrip('\n') if stripped_line not in seen: seen.add(stripped_line) unique_lines.append(line) # 重新写入原文件,覆盖原有内容 with open('myfile.csv', 'w', encoding='utf-8') as f: f.writelines(unique_lines)
如果你的CSV有表头,不想让表头参与去重,可以稍微修改脚本,单独保留表头:
with open('myfile.csv', 'r', encoding='utf-8') as f: # 读取第一行表头 header = next(f) seen = set() unique_lines = [header] for line in f: stripped_line = line.rstrip('\n') if stripped_line not in seen: seen.add(stripped_line) unique_lines.append(line) with open('myfile.csv', 'w', encoding='utf-8') as f: f.writelines(unique_lines)
方法2:Linux/macOS 命令行方案
如果你用的是类Unix系统,可以用命令行快速处理:
方案2.1:用sponge(简单直观)
sponge是moreutils工具包中的命令,它会先把输入内容全部读取完毕,再写入目标文件,避免直接重定向导致的文件清空问题。
首先安装moreutils(如果没装的话):
# Debian/Ubuntu 系列 sudo apt install moreutils # macOS(用Homebrew) brew install moreutils
然后执行去重命令:
# 去重并保留唯一行(会排序) sort -u myfile.csv | sponge myfile.csv
如果有表头,不想排序表头,可以这样:
# 保留表头,只对内容行去重排序 { head -n1 myfile.csv; tail -n+2 myfile.csv | sort -u; } | sponge myfile.csv
方案2.2:用awk+临时文件(无需额外安装工具)
如果不想装moreutils,可以用awk配合临时文件实现,执行完临时文件会自动替换原文件:
# 保留原始行顺序去重,不排序 awk '!seen[$0]++' myfile.csv > tmp_file && mv tmp_file myfile.csv
解释一下:awk会记录每行是否出现过(seen[$0]++),没出现过的行就会被打印到临时文件,最后用临时文件替换原文件,全程不会留下额外的文件。
⚠️ 重要提醒:不管用哪种方法,操作原文件前一定要先备份,比如执行cp myfile.csv myfile_backup.csv,避免意外情况导致数据丢失!
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

