先讲下需求,有若干个文本文件(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每一行的值,然后再插入合并,有时间再写个脚本,一篇文章解决一个问题就好。