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)