逐行读取文件生成DataFrame时int()与int(float())的区别及转换报错处理
问题修复方案
错误根因
- 语法缩进错误:Python对缩进敏感,你代码中函数内部的
with open逻辑、with代码块下的内容都没有正确缩进,导致读取逻辑完全异常,没有将每行按制表符分割成单个数字字符串,直接把整行带\t的长字符串传入类型转换函数,触发报错。 - 文件名拼写混乱:代码中出现
winsonsin labels.txt/wisconson.txt等多个拼写错误的文件名,和实际文件名称不匹配,会触发文件读取失败或读取错误内容。 - 函数参数未生效:
readLabels函数定义了fileName传参,但内部写死了文件路径,传入的参数不会生效。 - DataFrame构造错误:
pd.DataFrame(data , labels)的第二个参数默认是行索引,你需要显式指定columns=labels才能将标签设置为列名,否则数据结构完全不符合预期。
修复后可运行代码
import pandas as pd import plotly.express as px def readLabels(fileName): # 修正缩进,使用传入的fileName参数 with open(fileName, encoding='utf-8') as f: labels = f.read().strip().split(',') # 如果需要使用中文标签,可以替换为下一行代码 # labels = ["半径","纹理","周长","面积","平滑度","致密性","凹度","凹点","对称性","分类"] return labels def readData(fileName, labels): # 修正缩进 with open(fileName, 'r', encoding='utf-8') as f: lines = f.readlines() # 先过滤空行,再按空白字符分割,转int data = [[int(num) for num in line.strip().split()] for line in lines if line.strip()] # 修正DataFrame传参,指定columns为labels dataFrame = pd.DataFrame(data, columns=labels) return dataFrame def graph(data, labels): # 修正缩进 figure = px.parallel_coordinates(data_frame = data, color= 'class', dimensions = labels[:-1]) figure.show() # 修正文件名拼写,和实际文件一致 labels = readLabels("wisconsin labels.txt") data = readData("wisconsin.txt", labels ) graph(data, labels)
标签中文翻译
原标签对应的中文含义如下,可直接替换代码中的标签使用:
- 原标签:radius、texture、perimeter、area、smoothness、compactness、concavity、concave_points、symmetry、class
- 中文标签:半径、纹理、周长、面积、平滑度、致密性、凹度、凹点、对称性、分类
int() 与 int(float()) 类型转换的区别
int(输入值):要求输入必须是符合十进制整数规范的字符串或数值,输入为带小数点的字符串(如'3.0'、'5.9')、科学计数法字符串、空白字符时,会直接抛出转换错误,适合明确输入为纯整数字符串的场景。int(float(输入值)):会先将输入转换为浮点数,再截断小数部分转成整数,兼容带小数点的整数字符串、科学计数法表示的整数,但输入非数字字符串时仍会报错,且如果输入是带小数的非整数字符串(如'5.9')会直接截断为5,不会做四舍五入。
你的场景中所有数据都是整数,只要正确分割每行的数值,直接用int()转换即可,不需要走int(float())的逻辑。
内容的提问来源于stack exchange,提问作者Orianna Sanele
相关产品推荐
相关产品推荐

