前言
问题:对两个一一对应的txt文本文件进行去重操作,将结果保存
解决:pandas.concat & pandas.DataFrame.drop_duplicates
pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
一、代码
1. 保存到两个txt文件
def to2txt(file1_path,file2_path,file1,file2):
"""
对两个一一对应的txt文本文件进行去重,分别写入两个文件
:param file1_path: 文本1
:param file2_path: 文本2
:param file1: 输出文本1
:param file2: 输出文本2
:return:
"""
# read_csv读文件的时候,如果文本里包含英文双引号,直接读取会导致行数变少或是直接如下报错停止
# Error tokenizing data. C error: EOF inside string starting at row 1
zh_text = pd.read_csv(file1_path, header=None, sep='\n', quoting=3,
error_bad_lines=False) # 或者设置quoting=csv.QUOTE_NONE
en_text = pd.read_csv(file2_path, header=None, sep='\n', quoting=3,
error_bad_lines=False) # 或者设置quoting=csv.QUOTE_NONE
zh_en_text = pd.concat([zh_text, en_text], axis=1, keys=['zh', 'en']) # 拼接
zh_en_text.drop_duplicates(subset=None, keep='first', inplace=True) # 去重
zh = zh_en_text['zh'] # 取数据
en = zh_en_text['en'] # 取数据
assert len(zh) == len(en)
zh.to_csv(file1, sep='\n', index=False, header=False) # 写入文本1
en.to_csv(file2, sep='\n', index=False, header=False) # 写入文本2
2. 保存到excel
def to_excel(file1_path,file2_path,excel_file):
"""
对两个一一对应的txt文本文件进行去重,对应写入excel
:param file1_path: 文本1
:param file2_path: 文本2
:param file: excel文本路径
:return: 去重后的excel文件
"""
zh_text = pd.read_csv(file1_path, header=None, sep='\n', quoting=csv.QUOTE_NONE,
error_bad_lines=False)
en_text = pd.read_csv(file2_path, header=None, sep='\n', quoting=csv.QUOTE_NONE,
error_bad_lines=False)
zh_en_text = pd.concat([zh_text, en_text], axis=1) # 拼接
df = pd.DataFrame(zh_en_text.drop_duplicates()) # 去重
# 写入excel
writer = pd.ExcelWriter(excel_file, engine='xlsxwriter')
df.to_excel(writer, sheet_name='test1', header=None, index=None) # 不写入索引
writer.save()
二、使用
if __name__ == "__main__":
file1_path = "all_1.txt" # 待处理文本1
file2_path = "all_2.txt" # 待处理文本2
# file1 = "zh_test.txt" # 处理后txt文本路径1
# file2 = "en_test.txt" # 处理后txt文本路径2
# to2txt(file1_path,file2_path,file1,file2) # 去重,分别写入两个文件
excel_file = os.path.join(abspath, "result_files/drop_all.xlsx") # excel文本路径
to_excel(file1_path,file2_path,excel_file) # 去重,对应写入excel
总结
- 总体思路:将文本读取为DataFrame,对DataFrame结构的数据进行一系列操作,包括拼接、去重、写入文件
- 注意:read_csv在读文件的时候,如果文本里包含英文双引号,直接读取会导致行数变少或是直接如下报错停止
Error tokenizing data. C error: EOF inside string starting at row 1
解决方法:设置参数quoting
pd.read_csv(file_path, quoting=3)
pd.read_csv(file_path, quoting=csv.QUOTE_NONE)