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
相关产品推荐
相关产品推荐

