Python脚本报错TypeError: os.path.join参数应为字符串而非列表
问题:TypeError: join()参数必须是str, bytes或os.PathLike对象,而非list
我不是程序员,没接受过编程培训,这是我写的第一个Python脚本。除了谷歌搜索不知道怎么排查问题,但搜出来的结果解决不了当前问题。
我花了很多时间研究写这段代码,现在要把脚本转成exe,只剩最后一个问题要解决。在评论区帮助下大概找到了问题,但不知道怎么修复,求协助。
运行脚本时出现如下错误:
Traceback (most recent call last): File "D:\\MyDesktop\\Trading executions Conversions\\Convert_TopStepX_Orders_to_Pinescript.py", line 126, in <module> modify_spreadsheet(os.path.join(script_dir, xlsx_file), output_file) ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen ntpath>", line 139, in join File "<frozen genericpath>", line 188, in _check_arg_types TypeError: join() argument must be str, bytes, or os.PathLike object, not 'list'
报错行的注释为# Call the function。我的需求是修改所有xlsx文件并修改它们的文件名,代码逻辑是先创建待处理文件列表,再循环处理列表中的文件,但现在代码调用时传入的是列表而非单个文件。感谢John Gordon此前的帮助!
引发问题的代码段:
# Get the script directory script_dir = os.path.dirname(__file__) # Create the output folder if it doesn't exist output_folder = os.path.join(script_dir, "Trade Executions Scripts") os.makedirs(output_folder, exist_ok=True) def modify_spreadsheet(input_file, output_file): # Read the Excel file df = pd.read_excel(input_file) # Remove rows with "cancelled by system" or "cancelled by trader" in any cell df = df[~df.apply(lambda row: row.astype(str).str.contains('cancelled by system|cancelled by trader|Maximum position exceeded', case=False).any(), axis=1)] # Convert the date and time column to the desired format df.iloc[:, 9] = pd.to_datetime(df.iloc[:, 9]).apply(lambda x: f"{x.year}, {x.month}, {x.day}, {x.hour}, {x.minute}, {x.second}") # Save the updated spreadsheet without header\title row df.to_excel(output_file, index=False, header=False) # Get the list of all xlsx files in the input directory xlsx_file = [file for file in os.listdir(output_folder) if file.endswith(".xlsx")] xlsx_files = [f for f in os.listdir(script_dir) if f.endswith(".xlsx")] # Loop over the xlsx files and modify them for xlsx_file in xlsx_files: input_file = os.path.join(script_dir, xlsx_file) output_file = os.path.join(output_folder, f"{os.path.splitext(xlsx_file)[0]}_modified.xlsx") # Call the function modify_spreadsheet(os.path.join(script_dir, xlsx_file), output_file) print(f"Modified {xlsx_file} and saved to {output_file}")
修复方案
问题出在两个地方:
- 你定义了一个完全没用的
xlsx_file列表变量(就是xlsx_file = [file for ...]这一行),如果后续循环没执行(比如脚本目录下没有xlsx文件),调用os.path.join时会误用这个列表,直接触发类型错误。 - 处理文件的核心代码(调用
modify_spreadsheet和打印日志)没有缩进,不在for循环内部,所以只会执行一次,甚至会误用之前的列表变量。
修改后的代码:
# Get the script directory script_dir = os.path.dirname(__file__) # Create the output folder if it doesn't exist output_folder = os.path.join(script_dir, "Trade Executions Scripts") os.makedirs(output_folder, exist_ok=True) def modify_spreadsheet(input_file, output_file): # Read the Excel file df = pd.read_excel(input_file) # Remove rows with "cancelled by system" or "cancelled by trader" in any cell df = df[~df.apply(lambda row: row.astype(str).str.contains('cancelled by system|cancelled by trader|Maximum position exceeded', case=False).any(), axis=1)] # Convert the date and time column to the desired format df.iloc[:, 9] = pd.to_datetime(df.iloc[:, 9]).apply(lambda x: f"{x.year}, {x.month}, {x.day}, {x.hour}, {x.minute}, {x.second}") # Save the updated spreadsheet without header\title row df.to_excel(output_file, index=False, header=False) # Get the list of all xlsx files in the input directory # 删掉多余的xlsx_file列表定义 xlsx_files = [f for f in os.listdir(script_dir) if f.endswith(".xlsx")] # Loop over the xlsx files and modify them for xlsx_file in xlsx_files: input_file = os.path.join(script_dir, xlsx_file) output_file = os.path.join(output_folder, f"{os.path.splitext(xlsx_file)[0]}_modified.xlsx") # 将函数调用和打印缩进,放到循环内部 modify_spreadsheet(input_file, output_file) print(f"Modified {xlsx_file} and saved to {output_file}")
修改说明:
- 删除了没用的
xlsx_file = [file for ...]行,避免变量混淆。 - 把
modify_spreadsheet调用和print语句缩进,放到循环里,这样每个文件都会被依次处理。 - 直接用循环里已经生成的
input_file参数传给函数,不用重复调用os.path.join,简化代码逻辑。
内容的提问来源于stack exchange,提问作者shaneaus
相关产品推荐
相关产品推荐

