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

Python如何指定函数参数为文件类型并提取无后缀文件名?

问题1:指定file参数的文件类型

你可以通过Python的类型提示实现参数类型标注,你当前代码里file是直接传入pickle.load()的已打开二进制文件对象,标注方法如下:

  • 首先导入typing模块的BinaryIO类型(兼容性更强,Python 3.9+也可直接用io.BufferedReader)
  • 函数定义修改为:def import_prices(file: BinaryIO, start, end):
    如果后续你改为直接传入文件路径字符串,可将类型标注为str或者pathlib.Path,编辑器会自动识别参数类型做语法校验。

问题2:提取无后缀文件名填充占位符

你可以通过文件对象的name属性获取文件路径,再用模块提取无后缀文件名,这里提供两种简洁实现方案:

方案1:os模块实现

import os
# 提取无后缀文件名
file_full_name = os.path.basename(file.name)
file_name_without_suffix = os.path.splitext(file_full_name)[0]
# 填充占位符
main_df.to_csv(f'Webscrapper/{file_name_without_suffix}_prices.csv')

方案2:pathlib实现(Python 3.4+支持,语法更简洁)

from pathlib import Path
# 直接提取无后缀文件名
file_name_without_suffix = Path(file.name).stem
# 填充占位符
main_df.to_csv(f'Webscrapper/{file_name_without_suffix}_prices.csv')

修正后的完整代码

import pandas_datareader as web
import pandas as pd
import pickle
from typing import BinaryIO
from pathlib import Path


def import_prices(file: BinaryIO, start, end):
    tickers = pickle.load(file)
    main_df = pd.DataFrame()
    i = 0
    for ticker in tickers:
        df = web.DataReader(ticker, 'yahoo', start, end)
        df.rename(columns={"Adj Close": ticker}, inplace=True)
        df.drop(columns=["Open", "High", "Low",
             "Close", "Volume"], inplace=True)
        if main_df.empty:
            main_df = df
        else:
            main_df = main_df.join(df, how='outer')
        i = i + 1
        print(i)
    # 提取无后缀文件名并导出csv
    file_name_without_suffix = Path(file.name).stem
    main_df.to_csv(f'Webscrapper/{file_name_without_suffix}_prices.csv')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:15:02