如何将代码内篮球球员列表移至外部文件并匹配爬取数据?
解决方案:将硬编码球员列表移至外部文件并实现匹配逻辑
1. 外部球员列表文件的格式
创建players.txt,每行存储一个球员全名(和原代码里的格式完全一致):
Adebayo, Bam Allen, Jarrett Antetokounmpo, Giannis # 其他球员依次添加,空行会被自动过滤
2. 读取外部球员列表
用简单函数读取文件,生成可用于匹配的球员集合(集合比列表匹配效率更高):
def load_players(file_path): with open(file_path, 'r', encoding='utf-8') as f: # 过滤空行,同时去掉每行的换行符和首尾空白 return [line.strip() for line in f if line.strip()] # 加载外部球员列表并转成集合 basketball = load_players('players.txt') player_set = set(basketball)
3. 正确处理CSV文件并匹配球员
原代码存在模式错误(r只读模式无法执行写入操作),且未正确处理CSV的带引号字段,以下是修正后的完整匹配逻辑:
import csv # 存储匹配到的球员记录 matched_data = [] with open("freeze.csv", 'r', encoding='utf-8') as csv_file: reader = csv.reader(csv_file) for row in reader: # 遍历当前行的所有字段,检查是否存在匹配的球员 for field in row: # 清理字段的引号和首尾空白,和球员列表格式对齐 cleaned_field = field.strip('"').strip() if cleaned_field in player_set: matched_data.append(row) break # 找到匹配后停止当前行的遍历,避免重复记录 # 将匹配结果写入新文件(可根据需求调整输出路径) with open("matched_players.csv", 'w', encoding='utf-8', newline='') as output_file: writer = csv.writer(output_file) writer.writerows(matched_data)
4. 你之前尝试失败的原因解释
- 集合过滤首行失败:CSV文件中部分行以球队名称开头(如示例第一行),仅过滤首行无法覆盖所有球员所在行。
- csv.reader索引错误:CSV行的字段数量不固定,硬编码索引(如
row[1])会导致索引越界,遍历所有字段才是可靠方式。 - 嵌套循环无结果:CSV中球员字段带引号(如
"Ball, LaMelo"),未清理引号直接匹配会和球员列表中的无引号字符串不匹配,必须先统一格式。
内容的提问来源于stack exchange,提问作者DrFox
相关产品推荐
相关产品推荐

