You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递列表作为函数位置参数触发TypeError的问题排查与修复

问题修复方案

错误根源

你遇到的TypeError: Document() takes from 0 to 1 positional argument but 450 were given,核心原因是:

  • python-docx的Document()构造函数仅支持单个文件路径作为参数(或无参数创建空白文档),但你通过*files语法把整个文件列表拆成了数百个独立参数传入,导致参数数量超标。
  • 原代码还存在两个隐性错误:未导入os模块、变量初始化与追加不匹配(初始化files = []却往document_list里append)。

修复后的完整代码

1. 修正文件收集逻辑

import os
import pandas as pd
import io
import csv
from docx import Document

# 初始化正确的列表变量
document_list = []       
for path, subdirs, files in os.walk(r"path"): 
    for name in files:
        file_path = os.path.join(path, name)
        # 简化后缀判断逻辑
        if file_path.endswith(".docx"):
            document_list.append(file_path)

2. 重构read_docx_tables函数

将函数改为处理单个文件(符合Document()的参数要求),如果需要批量处理,外部循环调用即可:

def read_docx_tables(filename, tab_id=None, **kwargs):
    """
    解析Word文档(.docx)中的表格为Pandas DataFrame
    
    参数:
        filename: Word文档路径
        tab_id: 单个表格的索引(从0开始),为None时返回所有表格的DataFrame列表
        kwargs: 传递给pd.read_csv()的参数
    
    返回: 指定单个表格的DataFrame,或所有表格的DataFrame列表
    """
    def read_docx_tab(tab, **kwargs):
        vf = io.StringIO()
        writer = csv.writer(vf)
        for row in tab.rows:
            writer.writerow(cell.text for cell in row.cells)
        vf.seek(0)
        return pd.read_csv(vf, **kwargs)

    # 直接传入单个文件路径,不再使用*files拆包
    doc = Document(filename)
    if tab_id is None:
        return [read_docx_tab(tab, **kwargs) for tab in doc.tables]
    else:
        try:
            return read_docx_tab(doc.tables[tab_id], **kwargs)
        except IndexError:
            print(f'错误: 指定的表格索引[tab_id]: {tab_id} 不存在。')
            raise

3. 批量处理所有文件并导出CSV

# 存储所有解析后的DataFrame
all_dataframes = []

for file_path in document_list:
    try:
        # 解析当前文件的所有表格
        tables = read_docx_tables(file_path)
        all_dataframes.extend(tables)
        
        # 为每个表格导出CSV文件
        base_name = os.path.splitext(file_path)[0]
        for idx, df in enumerate(tables):
            csv_path = f"{base_name}_表格_{idx}.csv"
            df.to_csv(csv_path, index=False, encoding='utf-8-sig')
            print(f"已导出: {csv_path}")
    except Exception as e:
        print(f"处理文件 {file_path} 时出错: {str(e)}")

关键修改点说明

  • 移除了函数参数中的*files,改为单个filename参数,匹配Document()的参数要求。
  • 修正了文件收集部分的变量错误,补充了缺失的os模块导入。
  • 优化了后缀判断逻辑,使用endswith()更简洁。
  • 批量处理时通过外部循环遍历文件列表,逐个调用解析函数,避免一次性传入多个文件路径导致的参数错误。

内容的提问来源于stack exchange,提问作者user18708380

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:30:52