Python Pandas遇OSError[Errno22],需按type匹配填充txt文件内容
解决Pandas根据type列读取对应文件填充cal_str列的错误
错误原因
你代码里的df.type.to_string()会把整个type列转换成带索引和换行的字符串(比如输出0 1\n1 2\n2 3),拼接.txt后生成了0 1\n1 2\n2 3.txt这种包含换行和空格的无效文件名,这就是触发OSError的根源。
正确实现方式
下面提供两种可行的解决方案,都能实现仅给status为1的行,根据type值读取对应txt文件内容填充cal_str列的需求:
方法一:使用apply批量处理
import pandas as pd pd.options.display.max_columns = None data = { "type": [1, 2, 3], "duration": [50, 40, 45], "cal_str": [None,None,None], "status": [1,0,1] } df = pd.DataFrame(data) # 定义读取文件的函数,返回文件第一行内容(去除首尾空白符) def get_file_content(type_val): with open(f"{type_val}.txt", "r") as f: return f.readlines()[0].strip() # 筛选status=1的行,对type列应用读取函数并赋值给cal_str df.loc[df.status == 1, 'cal_str'] = df.loc[df.status == 1, 'type'].apply(get_file_content) print(df)
方法二:遍历符合条件的行
import pandas as pd pd.options.display.max_columns = None data = { "type": [1, 2, 3], "duration": [50, 40, 45], "cal_str": [None,None,None], "status": [1,0,1] } df = pd.DataFrame(data) # 遍历status为1的行的索引和type值,逐个读取文件填充 for idx, type_val in df.loc[df.status == 1, 'type'].items(): with open(f"{type_val}.txt", "r") as f: df.loc[idx, 'cal_str'] = f.readlines()[0].strip() print(df)
说明
- 两种方法都会得到你预期的结果:
cal_str列中status=1的行对应填充1.txt、3.txt的第一行内容,status=0的行保持None。 - 使用
with open语句可以自动关闭文件,比直接调用open()更安全,避免资源泄漏。 strip()方法用于去除文件内容首尾的换行符、空格等空白字符,可根据需求选择是否保留。
内容的提问来源于stack exchange,提问作者koceca
相关产品推荐
相关产品推荐

