問題:
先講下需求,有若干個文本文件(txt或者csv文件等),每行代表一條數據,現在希望能合併成 1 個文本文件,且需要去除重複行。
分析:
一向奉行簡單原則,如無必要,絕不復雜。
如果數據量不大,那麼如下兩條命令就可以搞定
合併:
cat a.txt >> new.txt
cat b.txt >> new.txt
……
去重:
cat new.txt | sort | uniq > outfile.txt
搞定,收工。
但是,但是,如果文本文件非常大,幾個G大小怎麼辦?下面一個腳本可以搞定:
python腳本:(python2.7 和 python3.6 都試過,可以運行)
創建腳本(和 *.txt 放在同一個目錄下)
# vim merge_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每一行的值,然後再插入合併,有時間再寫個腳本,一篇文章解決一個問題就好。
最後,把代碼傳在這裏:
https://download.csdn.net/download/cc1949/12352216