如何修复Python中'str'对象无'write'属性的AttributeError错误?
修复Python代码中的'str' object has no attribute 'write'错误
问题代码
def separate (gpsTrackPoints,gpsTrackPointsReorg): trackPoints = open (gpsTrackPoints,"r") trackPointsReorg = open (gpsTrackPointsReorg,"w") trackPoints.readline() lines = trackPoints.readlines() for line in lines: parts = line.split(",") pointID = parts[0] long = parts[1] lat = parts[2] alt = parts[3] dateTime = parts[4] dateTimeSplit = line.split("-") dateStr = dateTimeSplit[0] timeStr = dateTimeSplit[1] reOrg = ("pointID:{}, longitude:{}, latitude:{}, altitude:{}, date:{}, time:{}".format(pointID,long,lat,alt,dateStr,timeStr)) #reOrg = (pointID + "," + long + "," + lat + "," + "alt" + "," + "date" + "," + "time") gpsTrackPointsReorg.write(reOrg) trackPoints.close() trackPointsReorg.close() separate("C:/Users/trwil/SpatProg/HW3/Data/GPS_trackpoints.txt","C:/Users/trwil/SpatProg/HW3/Data/GPS_trackpointsReorg.txt")
错误原因
你调用gpsTrackPointsReorg.write(reOrg)时,gpsTrackPointsReorg是函数的字符串参数(传入的文件路径),不是打开的文件对象。真正的文件对象是你在函数内创建的trackPointsReorg变量,你搞混了参数名和文件对象名。
另外还有两个潜在问题:
- 拆分日期时间时,用
line.split("-")会把整行内容按-分割,应该针对parts[4]里的日期时间字符串拆分 - 写入文件时没有添加换行符,所有内容会挤在一行
修复后的代码
def separate(gpsTrackPoints, gpsTrackPointsReorg): # 使用with语句自动管理文件关闭,避免资源泄漏 with open(gpsTrackPoints, "r") as trackPoints, open(gpsTrackPointsReorg, "w") as trackPointsReorg: trackPoints.readline() # 跳过表头行 lines = trackPoints.readlines() for line in lines: line = line.strip() # 去除首尾空白和换行符 if not line: continue # 跳过空行 parts = line.split(",") pointID = parts[0] long = parts[1] lat = parts[2] alt = parts[3] dateTime = parts[4].strip() # 正确拆分日期和时间字段 dateTimeSplit = dateTime.split("-") dateStr = dateTimeSplit[0] timeStr = dateTimeSplit[1] # 添加换行符,确保每行一条记录 reOrg = f"pointID:{pointID}, longitude:{long}, latitude:{lat}, altitude:{alt}, date:{dateStr}, time:{timeStr}\n" # 使用正确的文件对象调用write方法 trackPointsReorg.write(reOrg) separate("C:/Users/trwil/SpatProg/HW3/Data/GPS_trackpoints.txt", "C:/Users/trwil/SpatProg/HW3/Data/GPS_trackpointsReorg.txt")
关键修复点
- 将
gpsTrackPointsReorg.write(reOrg)改为trackPointsReorg.write(reOrg),使用函数内创建的文件对象 - 用
with语句管理文件,无需手动调用close() - 修正日期时间拆分逻辑,针对目标字段而非整行
- 添加换行符
\n,使输出文件格式更规范
内容的提问来源于stack exchange,提问作者Terri Williams
相关产品推荐
相关产品推荐

