Python中无法在CSV文件中匹配NASDAQ股票代码的问题求助
嘿,我来帮你解决这个股票代码匹配的问题!首先咱们得先捋清楚你可能踩的几个常见坑,然后给你两个靠谱的实现方案——一个用pandas(处理CSV超方便),一个用Python原生csv模块(不用额外装库)。
先说说你可能遇到匹配失败的原因
- 大小写/空格问题:纳斯达克的股票代码都是大写,但你的
finalsheet.csv里可能有小写或者前后带空格的情况,直接匹配肯定找不到 - 列名不对应:比如
nasdaq.csv里的代码列叫Symbol,但你读取的时候用了Ticker作为列名,自然拿不到正确的数据 - 数据脏了:CSV里可能有空行、空值或者异常字符,导致读取的数据不对
方案一:用Pandas快速处理(推荐,代码简洁高效)
假设你的两个CSV结构大概是这样(你可以根据自己的实际列名修改):
nasdaq.csv示例:
Symbol,Company Name,Price
AAPL,Apple Inc.,190.5
MSFT,Microsoft Corp.,378.25
finalsheet.csv示例:
Ticker,My Price
aapl,191.0
GOOG,142.3
ABC,50.0
直接上代码:
import pandas as pd # 读取两个CSV文件,这里的列名要和你实际文件里的对应! nasdaq_data = pd.read_csv('nasdaq.csv') my_stocks = pd.read_csv('finalsheet.csv') # 关键步骤:清理数据——去除前后空格,统一转为大写 nasdaq_symbols = nasdaq_data['Symbol'].str.strip().str.upper() my_tickers = my_stocks['Ticker'].str.strip().str.upper() # 给我的股票列表添加一列,标记是否属于纳斯达克 my_stocks['Is_NASDAQ'] = my_tickers.isin(nasdaq_symbols) # 可以打印结果,或者保存到新CSV里 print("匹配结果:") print(my_stocks) # my_stocks.to_csv('nasdaq_matched_stocks.csv', index=False)
方案二:用Python原生CSV模块(不用装额外库)
如果你不想用pandas,用Python自带的csv模块也能搞定,而且用集合来存纳斯达克代码,查找速度会快很多:
import csv # 第一步:把纳斯达克所有代码存入集合(集合查找比列表快N倍) nasdaq_symbols = set() with open('nasdaq.csv', 'r', encoding='utf-8') as nasdaq_file: reader = csv.DictReader(nasdaq_file) for row in reader: # 清理代码格式:去空格+转大写 clean_symbol = row['Symbol'].strip().upper() nasdaq_symbols.add(clean_symbol) # 第二步:遍历自己的股票列表,做匹配并保存结果 with open('finalsheet.csv', 'r', encoding='utf-8') as in_file, \ open('matched_result.csv', 'w', newline='', encoding='utf-8') as out_file: reader = csv.DictReader(in_file) # 给结果文件加一列Is_NASDAQ fieldnames = reader.fieldnames + ['Is_NASDAQ'] writer = csv.DictWriter(out_file, fieldnames=fieldnames) writer.writeheader() for row in reader: clean_ticker = row['Ticker'].strip().upper() # 判断是否在纳斯达克集合里 row['Is_NASDAQ'] = 'Yes' if clean_ticker in nasdaq_symbols else 'No' writer.writerow(row) print("匹配完成,结果已保存到matched_result.csv")
几个排查小技巧
- 先打印几个清理后的代码看看:比如
print(nasdaq_symbols)和print(my_tickers),确认格式是不是统一的 - 检查有没有空值:用pandas的话可以跑
print(nasdaq_data['Symbol'].isnull().sum()),如果有空值可以用nasdaq_data = nasdaq_data.dropna(subset=['Symbol'])删掉 - 确认列名绝对正确:比如你打开CSV文件看一下,代码列到底叫什么,别写错了
内容的提问来源于stack exchange,提问作者Trying to learn
相关产品推荐
相关产品推荐

