1. url问题
你遇到的这个警告信息是来自 xlsxwriter 库的一个提示,它与你在使用 pandas.to_excel() 保存 Excel 文件时有关。 🚨 警告内容解析 Anaconda3_202105\envs\py38\lib\site-packages\xlsxwriter\worksheet.py:1179: UserWarning: Ignoring URL 'https://tos-prod.com/mp3-003-001/a-163830606-P6-T3-M3-C64332788-1775742124494-1775752727.mp3' since it exceeds Excel's limit of 65,530 URLS per worksheet. 含义: xlsxwriter 是 pandas 在保存 .xlsx 文件时默认使用的库之一(尤其在使用 to_excel() 时)。 Excel 对单个工作表中能插入的 超链接数量有限制:最多 65,530 个。 如果你的 DataFrame 中包含大量 URL 字段(例如每行一个),并且这些 URL 被自动识别为超链接(hyperlink),那么当总数超过限制时,就会出现这个警告。 系统会自动忽略超出的部分 URL,不将其作为超链接插入。
✅ 为什么会触发这个警告? 这通常是因为你的数据中有如下情况: 某列字段全是 URL(如 "http://..." 或 "https://..." ); 并且该列被 Excel 自动识别为超链接; 数据量很大,导致 URL 数量超过 Excel 的限制(65,530 个)。
2. 分析问题
🔧 解决方案 ✅ 方法一:关闭自动识别 URL 为超链接 你可以通过设置参数来告诉 Excel 不要将 URL 自动识别为超链接。但 Pandas 本身没有直接提供这个选项,你需要手动操作。 使用 openpyxl 引擎写入 Excel(推荐) merged_df.to_excel(output_file_path, index=False, engine='openpyxl') ✅ openpyxl 不会自动将 URL 识别为超链接,因此不会触发这个警告。 ✅ 方法二:预处理数据,将 URL 改为非链接格式 如果你希望保留 URL 内容,但不想让它们变成超链接,可以将 URL 列中的值前面加上 ' 符号,这样 Excel 会把它当作文本处理。 merged_df['url_column'] = merged_df['url_column'].apply(lambda x: f"'{x}") ✅ 方法三:分片写入多个工作表(如果数据量极大) 如果你的数据非常大,也可以考虑将数据拆分成多个 sheet 写入,避免单个 sheet 超出限制: with pd.ExcelWriter(output_file_path, engine='openpyxl') as writer: for i in range(0, len(merged_df), 65000): # 每个工作表不超过65000行 chunk = merged_df[i:i+65000] chunk.to_excel(writer, sheet_name=f"Sheet_{i//65000}", index=False)
3. 合并excel
3.1 方法一
import os import glob import pandas as pd # 获取所有要合并的Excel文件 input_folder = r'D:\Data\to_merge' # 更改为你的输入文件夹路径 output_folder = r'D:\Data\to_merge_output' # 更改为你的输出文件夹路径 output_file_name = 'merged_80w.xlsx' # 更改为你的输出文件名 all_files = glob.glob(os.path.join(input_folder, "*.xlsx")) if os.path.exists(output_folder) is False: os.makedirs(output_folder) # 读取并合并所有Excel文件 dfs = [] for file in all_files: print(f"正在合并 {file}") df = pd.read_excel(file, engine='xlrd') dfs.append(df) merged_df = pd.concat(dfs, ignore_index=True) # 将合并后的数据保存到另一个文件夹 output_file_path = os.path.join(output_folder, output_file_name) # merged_df.to_excel(output_file_path, index=False) merged_df.to_excel(output_file_path, index=False, engine='openpyxl') print(f"合并后的Excel文件已保存到 {output_file_path}")
3.2 方法二
# ============================ # -*- coding: utf-8 -*- # @Time: 2026/4/15 14:41 # ============================ import os import glob import pandas as pd from openpyxl import Workbook from openpyxl.utils.dataframe import dataframe_to_rows def get_files_list(input_dir): file_path_list = [] print(input_dir) for dirpath,dirnames,filenames in os.walk(input_dir): for filename in filenames: if filename.startswith('~'): continue file_path = os.path.join(dirpath, filename) file_path_list.append(file_path) print(file_path_list) return file_path_list def write_data_to_file(df, output_path, file_type='csv', chunk_size=10000): """ 将 DataFrame 分块写入 CSV 或 Excel 文件,并每写入 1 万行打印一次进度。 :param df: DataFrame 数据 :param output_path: 输出文件路径(带后缀) :param file_type: 'csv' 或 'excel' :param chunk_size: 每块大小,默认 10000 行 """ # 清洗掉 Unnamed 列 df = df.loc[:, ~df.columns.str.contains('^Unnamed')] if not os.path.exists(os.path.dirname(output_path)): os.makedirs(os.path.dirname(output_path)) print(f"开始写入 {file_type.upper()} 文件到 {output_path}...") if file_type == 'csv': # 写入 CSV 格式 for i in range(0, len(df), chunk_size): chunk = df[i:i + chunk_size] chunk.to_csv( output_path, mode='a', header=(i == 0), index=False, encoding='utf-8-sig' ) print(f"✅ 已写入 {i + len(chunk)} 行") print("✔️ CSV 写入完成。") elif file_type == 'excel': # 使用 openpyxl 写入 Excel 格式 wb = Workbook() ws = wb.active header_written = False for i in range(0, len(df), chunk_size): chunk = df[i:i + chunk_size] for row in dataframe_to_rows(chunk, index=False, header=not header_written): ws.append(row) header_written = True print(f"✅ 已写入 {i + len(chunk)} 行") wb.save(output_path) print("✔️ Excel 写入完成。") else: raise ValueError("不支持的文件类型,请选择 'csv' 或 'excel'。") # === 主程序入口 === if __name__ == '__main__': # 获取所有要合并的Excel和CSV文件 input_folder = r'D:\Data\test' # 更改为你的输入文件夹路径 output_folder = r'D:\Data\test_merge_output' # 更改为你的输出文件夹路径 output_file_name = 'merged_40w.xlsx' # 更改为你的输出文件名 # 将合并后的数据保存到另一个文件夹 output_file_path = os.path.join(output_folder, output_file_name) # 匹配所有 .csv 和 .xlsx 文件 # all_files = glob.glob(os.path.join(input_folder, "*.csv")) + \ # glob.glob(os.path.join(input_folder, "*.xlsx")) # 示例数据(你可以替换为你的 merged_df) all_files = get_files_list(input_dir=input_folder) if not os.path.exists(output_folder): os.makedirs(output_folder) # 读取并合并所有文件 dfs = [] for input_file_path in all_files: print(f"正在合并 {input_file_path}") # if file.endswith('.csv'): # df = pd.read_csv(file, on_bad_lines='skip', sep=',', engine='python') # else: # df = pd.read_excel(file, engine='openpyxl') # 推荐使用 openpyxl 读取 .xlsx encodings = ['gbk', 'utf-8', 'utf-8-sig', 'GB2312', 'gb18030', ] for e in encodings: try: if ".csv" in input_file_path: # df = pd.read_csv(input_file_path, encoding=e) # df = pd.read_csv(input_file_path, sep=None, encoding=e, engine='python') df = pd.read_csv(input_file_path, encoding=e, error_bad_lines=False, engine='python') else: df = pd.read_excel(input_file_path) # df = pd.read_csv(input_file_path, encoding=e) # df = df.drop_duplicates() print('|> right read encoding: ', e) break except: print('read error:', e) pass dfs.append(df) merged_df = pd.concat(dfs, ignore_index=True) # 可选:手动指定写入格式(也可以通过 input 让用户输入) file_type = 'excel' # 或 'csv' # 执行写入 write_data_to_file(merged_df, output_file_path, file_type=file_type)