Python导入CSV做文本分析:选csv.reader()还是csv.DictReader()?
选csv.DictReader()更适合你的需求!
嘿,作为刚接触Python和NLTK的新手,这种选择纠结太正常啦!我来帮你理清楚两者的区别,再结合你的需求给出最适合的建议~
先搞懂两者的核心差异
- csv.reader():把每行数据转换成列表,你得靠索引去提取列数据(比如
row[0]、row[1])。但问题是你得牢牢记住每个列对应的索引,万一CSV的列顺序变了,你的代码直接就出错了,对新手来说很容易踩坑。 - csv.DictReader():把每行数据转换成字典,CSV的表头就是字典的键,你可以直接用列名取数据(比如
row['Review Details']、row['Recommendation'])。不用记索引,就算列顺序调整了也不影响代码,可读性拉满。
结合你的需求看,选DictReader准没错
你的核心需求是:重点处理Review Details和Recommendation这两个特定列,还要新增tokens这类列。用DictReader的优势非常明显:
- 直观定位目标列:不用费劲找索引,直接写列名就能拿到数据,代码逻辑一目了然,新手调试起来也轻松。
- 新增列更方便:要加
tokens列的话,直接给字典加键值对就行(比如row['tokens'] = 处理后的分词结果),后续写入新CSV也能自动对应列名。
给你个简单的示例代码参考
先确保已经安装并下载了NLTK的分词包(第一次用要跑nltk.download('punkt')):
import csv from nltk.tokenize import word_tokenize # 读取原始CSV并处理 with open('product_reviews.csv', 'r', encoding='utf-8') as infile: # 用DictReader自动识别表头作为字典键 reader = csv.DictReader(infile) # 准备新的字段列表,包含原列+新增的tokens列 fieldnames = reader.fieldnames + ['tokens'] # 写入处理后的CSV with open('processed_reviews.csv', 'w', encoding='utf-8', newline='') as outfile: writer = csv.DictWriter(outfile, fieldnames=fieldnames) writer.writeheader() # 写入新表头 for row in reader: # 提取Review Details列的文本并分词 review_text = row['Review Details'] tokens = word_tokenize(review_text.lower()) # 转小写后分词 # 给当前行添加tokens列 row['tokens'] = tokens # 写入处理后的行 writer.writerow(row)
为啥不推荐csv.reader()?
如果非要用reader的话,你得先手动获取列索引,代码会繁琐很多,比如:
import csv from nltk.tokenize import word_tokenize with open('product_reviews.csv', 'r', encoding='utf-8') as infile: reader = csv.reader(infile) headers = next(reader) # 先读取表头 # 手动找目标列的索引 review_idx = headers.index('Review Details') with open('processed_reviews.csv', 'w', encoding='utf-8', newline='') as outfile: writer = csv.writer(outfile) writer.writerow(headers + ['tokens']) # 写入新表头 for row in reader: review_text = row[review_idx] tokens = word_tokenize(review_text.lower()) row.append(tokens) # 把分词结果加到行末尾 writer.writerow(row)
一旦CSV的列顺序变了,review_idx就会对应错误的列,排查起来很麻烦,对新手不友好。
总结下来,优先选csv.DictReader(),它更贴合你的需求,代码更清晰,能帮你少踩很多不必要的坑,专注在文本分析本身~
内容的提问来源于stack exchange,提问作者cya2017
相关产品推荐
相关产品推荐

