如何修复逐行读取文本文件转DataFrame时的报错问题?
修复后的代码及问题解析
问题点梳理
- 正则表达式错误:Python的
re模块不支持/gm这类JS风格的修饰符,该写法会被当作正则的一部分,导致匹配失败。 - 数据收集逻辑错误:
data_list定义在循环外部,仅会保存最后一次循环的结果,而非所有行数据;且未提前初始化变量,若文件开头无电影ID行,会触发NameError。 - DataFrame构造错误:直接用单个列表构造DataFrame会生成单列数据,而非预期的4列结构。
- 重复正则匹配:同一行多次调用
re.search,浪费性能。
修复后的代码
import re import pandas as pd # 初始化数据列表和电影ID变量 data_list = [] movie_id = None with open('/Users/Desktop/Final Semester Fall 2022/archive/combined_data_1.txt', encoding='latin-1') as f: for line in f: line = line.strip() # 去除首尾空白字符,避免空行干扰 if not line: continue # 匹配电影ID行(格式:数字:) movie_match = re.match(r"^(\d+):$", line) if movie_match: movie_id = movie_match.group(1) continue # 匹配评分数据行(格式:用户ID,评分,日期) rating_match = re.match(r"^(\d+),(\d+),(\d{4}-\d{2}-\d{2})$", line) if rating_match and movie_id is not None: customerid = rating_match.group(1) rating = rating_match.group(2) date = rating_match.group(3) # 将当前行数据加入列表 data_list.append([customerid, rating, date, movie_id]) # 构造DataFrame并指定列名 df1 = pd.DataFrame(data_list, columns=['customer_id', 'rating', 'date', 'movie_id']) # 保存为CSV,关闭索引列输出 df1.to_csv('/Users/Desktop/Final Semester Fall 2022/archive/combineddata1.csv', index=False)
关键修复说明
- 修正正则表达式:使用
re.match(精准匹配行开头)替代re.search,移除无效的/gm修饰符,确保匹配逻辑正确。 - 调整数据收集逻辑:将
data_list初始化在循环外,每次匹配到有效评分数据就追加到列表中;提前初始化movie_id,避免未定义错误。 - 规范DataFrame构造:传入二维列表(每个子列表对应一行数据),并指定列名,生成预期的4列结构;保存CSV时添加
index=False避免生成额外的索引列。 - 优化匹配性能:每行仅做两次正则匹配,将匹配结果保存到变量中,避免重复调用匹配函数。
内容的提问来源于stack exchange,提问作者Sirod
相关产品推荐
相关产品推荐

