You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复逐行读取文本文件转DataFrame时的报错问题?

修复后的代码及问题解析

问题点梳理

  1. 正则表达式错误:Python的re模块不支持/gm这类JS风格的修饰符,该写法会被当作正则的一部分,导致匹配失败。
  2. 数据收集逻辑错误:data_list定义在循环外部,仅会保存最后一次循环的结果,而非所有行数据;且未提前初始化变量,若文件开头无电影ID行,会触发NameError。
  3. DataFrame构造错误:直接用单个列表构造DataFrame会生成单列数据,而非预期的4列结构。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:41:03