# -*- coding: utf-8 -*- # @Time : 2022/8/22 14:35 # @Author : ZAOXG # @File : merge_table.py import re import os import pandas as pd import traceback from pprint import pprint import csv from data_process_tool import read_data from data_process_tool import write_data def merge_table(path, file_list: list = None, to_type: str = 'xlsx', duplicates: list = None, on_columns: list = None, **kwargs): """ 合并指定目录下的所有文件 """ write_kwargs = {} if kwargs.get('keep'): write_kwargs['keep'] = kwargs.pop('keep', None) if not file_list: file_list = get_dirs_file(path, kwargs.pop('file_sort', False)) r: pd.DataFrame = pd.DataFrame() for file in file_list: if file.endswith(('.zip', '.7z')): continue try: temp_t = read_data(os.path.join(path, file), **kwargs) print('%s -> %s' % (file, temp_t.shape)) # temp_t['source'] = source if on_columns and len(on_columns): temp_t = temp_t[on_columns] r = pd.concat([r, temp_t]) except Exception as e: traceback.print_exc() print(e) print(file) if duplicates: r.drop_duplicates(subset=duplicates, inplace=True, **write_kwargs) file_name = re.split(r'\\|/', path)[-1] full_name = os.path.join(path, file_name) write_data(r, full_name+f'.{to_type}', index=False) return path, r.shape[0] def get_dirs_file(file_dir, file_sort: bool = False): all_files = [] for root, dirs, files in os.walk(file_dir): if file_sort: files.sort(key=lambda x: int(x.split('.')[0])) for file in files: all_files.append(os.path.join(root, file)) for dir_ in dirs: full_dir = os.path.join(root, dir_) file_list = os.listdir(full_dir) if file_sort: file_list.sort(key=lambda x: float(x.rsplit('.', maxsplit=2)[0])) for file in file_list: all_files.append(os.path.join(full_dir, file)) return all_files def split_filename(path): fileHead = {} files = os.listdir(path) for file in files: filename, filetype = os.path.splitext(file) head = re.split(r'\d', filename)[0] fileHead.setdefault(head, []).append( os.path.join(path, file) ) return fileHead def merge_file2(file_list: list, filename: str = None, to_type: str = 'xlsx'): r: pd.DataFrame = pd.DataFrame() for file in file_list: if file.endswith(('.zip', '.7z')): continue try: temp_t = read_data(file) # temp_t['source'] = file r = pd.concat([r, temp_t]) except Exception as e: traceback.print_exc() print(file) write_data(r, filename + f'.{to_type}', index=False) def merge_by_file_head(): OUT_PATH = 'Z:/temp-data/集成电路4.11-2/作者合并' mm = split_filename('Z:/temp-data/集成电路4.11-2/重新下载文件') for m1, m2 in mm.items(): merge_file2(m2, os.path.join(OUT_PATH, m1), to_type='csv') def merge_csv_files(path): file_name = re.split(r'\\|/', path)[-1] full_name = os.path.join(path, file_name) with open(full_name+'.csv', 'a', encoding='utf-8', newline='') as new_merge_file: files = os.listdir(path) for file in files: print(file) if file.endswith('.csv'): file_path = os.path.join(path, file) try: with open(file_path, 'r', encoding='utf-8') as f: new_merge_file.write(f.read()) except Exception as exception: print(exception) print('合并完成') def merge_txt_files(path): file_name = re.split(r'\\|/', path)[-1] full_name = os.path.join(path, file_name) has_header = False with open(full_name+'.csv', 'ab') as new_merge_file: files = os.listdir(path) for file in files: print(file) if file.endswith('.txt'): file_path = os.path.join(path, file) try: with open(file_path, 'rb') as f: if not has_header: head_line = f.readline() new_merge_file.write(head_line) while line_data := f.readline(): new_merge_file.write(line_data) except Exception as exception: print(exception) print('合并完成') def count_file_rows(path: str = None): rows_count = 0 files_count = 0 files_info = {} files = os.listdir(path) for file in files: file_path = os.path.join(path, file) try: with open(file_path, 'r', encoding='utf-8') as f: lines = f.readlines() rows_count += len(lines) files_info[file] = len(lines) except Exception as e: files_info[file] = str(e) files_count += 1 return { 'files_path': path, 'rows_count': rows_count, 'files_count': files_count, 'files_info': files_info, 'exclude_head': rows_count - files_count } if __name__ == '__main__': # merge_table(fr'Y:\zhaoxiangpeng\BCR\2025BCR\API采集', encoding_errors='ignore', on_bad_lines='skip') # merge_table(fr'Z:\文章摘要推荐池\toppaper核心数据\初始文章数据\2023-3月\Highly Cited Papers', on_columns=['EID'], encoding_errors='ignore', on_bad_lines='skip') # merge_table(fr'Z:\文章摘要推荐池\toppaper核心数据\初始文章数据\2023-3月\Highly Cited Papers', encoding_errors='ignore', on_bad_lines='skip', engine='python', skiprows=1, skipfooter=2) # merge_table(fr'Y:\wos-metadata\wos increment-202403\03', encoding_errors='ignore', on_bad_lines='skip', duplicates=['UT'], keep='last', file_sort=False) # merge_table(fr'Y:\zhaoxiangpeng\2024BCR\API采集数据', encoding_errors='ignore', on_bad_lines='skip', to_type="txt") merge_table(fr"Z:\客户数据存储\WOS\清华大学\OG=(Tsinghua University) AND (PY==(2024))", duplicates=['UT'], encoding_errors='ignore', on_bad_lines='skip', keep='last', file_sort=True) # merge_table(fr"Y:\数据采集需求\wosid下载\incites教育部学科数据", duplicates=['入藏号'], keep='last', on_columns=['入藏号', 'DOI'], on_bad_lines='skip') # merge_table(fr"F:\工作数据存储2025\20250101_中文发文引文更新\2024", duplicates=['网址'], keep='last', to_type='csv') # merge_table(fr'Z:\客户数据存储\专利\中南大学\23~', to_type='csv') # merge_table(fr'Y:\wos-metadata\SCHOOL\bj\待下载DOI', to_type='csv', duplicates=['DO']) # merge_table(fr'F:\工作数据存储2023\20231221_北京师范大学\补充数据\EI', on_bad_lines='skip', on_columns=['Accession number'], duplicates=['Accession number'], to_type='xlsx') # duplicates=['Title', 'Accession number'] # merge_table(fr'Z:\文章摘要推荐池\toppaper核心数据\初始文章数据\2023-3月\Highly Cited Papers', encoding="ISO-8859-1", on_bad_lines='skip', engine='python', skiprows=1, skipfooter=2, duplicates=['Accession Number'], to_type='xlsx') # merge_by_file_head() # file_s = ['Z:/客户数据存储/TEMP\\电子科技大学\\电子科技大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西安建筑科技大学\\西安建筑科技大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\四川大学\\四川大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中山大学\\中山大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中国农业大学\\中国农业大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\江苏师范大学\\江苏师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中国人民大学\\中国人民大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\上海工程技术大学\\上海工程技术大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西安交通大学\\西安交通大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\首都师范大学\\首都师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西北工业大学\\西北工业大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\重庆交通大学\\重庆交通大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\清华大学\\清华大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\长安大学\\长安大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\三江学院\\三江学院2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\华东师范大学\\华东师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\福州大学\\福州大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\安徽医科大学\\安徽医科大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\扬州大学\\扬州大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\北京理工大学\\北京理工大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\兰州大学\\兰州大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\江汉大学\\江汉大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\上海电力大学\\上海电力大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\华东理工大学\\华东理工大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西安电子科技大学\\西安电子科技大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西北师范大学\\西北师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\上海财经大学\\上海财经大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\三峡大学\\三峡大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京中医药大学\\南京中医药大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\浙江大学\\浙江大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中南大学\\中南大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\同济大学\\同济大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中国科学技术大学\\中国科学技术大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中欧国际工商学院\\中欧国际工商学院2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\合肥工业大学\\合肥工业大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京航空航天大学\\南京航空航天大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京工程学院\\南京工程学院2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\江南大学\\江南大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\安徽建筑大学\\安徽建筑大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中南财经政法大学\\中南财经政法大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\河南师范大学\\河南师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\曲阜师范大学\\曲阜师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京农业大学\\南京农业大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京林业大学\\南京林业大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西南财经大学\\西南财经大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京医科大学\\南京医科大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\国防科技大学\\国防科技大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京大学\\南京大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京师范大学\\南京师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\深圳大学\\深圳大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\华中科技大学\\华中科技大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\成都理工大学\\成都理工大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西南科技大学\\西南科技大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\江苏大学\\江苏大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中国矿业大学\\中国矿业大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\闽江学院\\闽江学院2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\吉林大学\\吉林大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\中国地质大学(武汉)\\中国地质大学(武汉)2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\陕西师范大学\\陕西师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\常州大学\\常州大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西南交通大学\\西南交通大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\苏州大学\\苏州大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\东南大学\\东南大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\首都医科大学\\首都医科大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\湖南师范大学\\湖南师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\北京科技大学\\北京科技大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京审计大学\\南京审计大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\郑州大学\\郑州大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京工业大学\\南京工业大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\湖南师范\\湖南师范2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\北京师范大学\\北京师范大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\西南民族大学\\西南民族大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\深圳技术大学\\深圳技术大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\南京财经大学\\南京财经大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\天津大学\\天津大学2023-2023中文发文.csv', 'Z:/客户数据存储/TEMP\\河海大学\\河海大学2023-2023中文发文.csv'] # # merge_file2(file_list=file_s, filename='F:/工作数据存储2023/20230615_中文发文引文更新/2023', to_type='csv') # d = read_data(r'Z:\客户数据存储\专利\南京大学\南京大学-专利网.xlsx') # d.to_csv(r'Z:\客户数据存储\专利\南京大学\南京大学-专利网.csv', index=False) # merge_csv_files(r'Z:\客户数据存储\WOS\南京工业大学\OG=(Nanjing Tech University) AND (PY==(2022))') # pprint(count_file_rows(r'Z:\客户数据存储\EI\东南大学\2023')) """ path_root = 'Z:\客户数据存储\WOS\成都理工大学' for x in os.listdir(path_root): # if x != '2002': # continue # Accession number # merge_table(os.path.join(path_root, x), on_columns=['Accession number'], duplicates=['Accession number'], to_type='csv') merge_table(os.path.join(path_root, x), duplicates=['UT'], keep='last', file_sort=True) """