先讲下需求,有若干个文本文件(txt或者csv文件等),每行代表一条数据,现在希望能合并成 1 个文本文件,且需要去除重复行。
一向奉行简单原则,如无必要,绝不复杂。
如果数据量不大,那么如下两条命令就可以搞定
合并:
cat a.txt >> new.txt
cat b.txt >> new.txt
……
去重:
cat new.txt | sort | uniq > outfile.txt
搞定,收工。
但是,但是,如果文本文件非常大,几个G大小怎么办?下面一个脚本可以搞定:
创建脚本(和 *.txt 放在同一个目录下)
# vimmerge_and_unique.py
#coding=utf-8
import os
import pandas as pd
import glob
outFileName = 'out_merged_result.csv'
def merge():
txt_list = glob.glob('*.txt')
print(u'共发现%s个txt文件!'% len(txt_list))
print(u'开始合并:')
for i in txt_list:
fr = open(i,'r').read()
with open(outFileName,'a') as f:
f.write(fr)
print(u'合并完毕!')
def unique(file):
df = pd.read_csv(file, header=0, error_bad_lines=False, quotechar=None, quoting=3)
dataList = df.drop_duplicates()
dataList.to_csv(file)
if __name__ == '__main__':
print(u'查找当前目录下的txt文件:')
merge()
print(u'开始去重:')
unique(outFileName)
print(u'去重完成!')
将merge_and_unique.py脚本和 *.txt 放在同一个目录下,执行
# python merge_and_unique.py
查找当前目录下的txt文件
共发现5个txt文件
开始合并!
合并完毕!
开始去重!
sys:1: DtypeWarning: Columns (0,1,2) have mixed types.Specify dtype option on import or set low_memory=False.
去重完成!
#
如果报错,找不到pandas:
Traceback (most recent call last):
File "merge_and_unique.py", line 3, in <module>
import pandas as pd
ModuleNotFoundError: No module named 'pandas'
请pip安装pandas
pip install pandas
1、如果一不小心,看了下上面的几行代码,会发现,不但可以运行txt的合并,csv的合并也是可以的。
2、如果数据数量达到百亿级别呢?可以试试hash每一行的值,然后再插入合并,有时间再写个脚本,一篇文章解决一个问题就好。