Python 为什么我会收到AttributeError消息?
我有一个名为tweets.txt的文件。每行的格式如下: [纬度,经度]值日期时间文本 文件中包含的数据示例如下: [41.29866962999999,-81.915329330000006]6 2011-08-28 19:02:36工作需要飞逝。。。我很高兴看到《间谍小子4》和我一生的挚爱。。。欠费Python 为什么我会收到AttributeError消息?,python,attributeerror,Python,Attributeerror,我有一个名为tweets.txt的文件。每行的格式如下: [纬度,经度]值日期时间文本 文件中包含的数据示例如下: [41.29866962999999,-81.915329330000006]6 2011-08-28 19:02:36工作需要飞逝。。。我很高兴看到《间谍小子4》和我一生的挚爱。。。欠费 今天将是我一生中最伟大的一天。受雇在我最好朋友的父母50周年纪念日拍照。60位老人。呜呜。 [38.8099549399997,-77.12514405000003]6 2011-08-28 1
今天将是我一生中最伟大的一天。受雇在我最好朋友的父母50周年纪念日拍照。60位老人。呜呜。
[38.8099549399997,-77.12514405000003]6 2011-08-28 19:07:05我只是把我的生命放在5个行李箱里 我的作业要求我提取每行的第一个和第二个索引(纬度和经度,它们是整数)。问题是这些字符有“[”、“、”和“]”等字符,我想删除这些字符
tweetfile=input("Enter name of tweet file: ")
infile=open(tweetfile,"r",encoding="utf-8")
for line in infile:
line=line.rstrip()
word=line.split()
word=word.rstrip(",")
如您所见,每当我在上面的字带行中输入参数时,无论是[、逗号还是[,我都会收到一条错误消息,上面说:
AttributeError:“list”对象没有属性“rstrip”
为什么我会收到此消息?我认为我做的是正确的。正确的方法是什么?
split
将字符串拆分为一个列表。当需要对每个单词调用时,您正在尝试对实际列表执行rstrip
您可以循环浏览列表以实现以下目的:
for line in infile:
line=line.rstrip()
for word in line.split():
word=word.rstrip(",")
或者,你可以像以前一样拆分它&通过索引访问你想要的单词
请澄清:
在代码中,split()
将word
转换为:
[“[38.8099549399997,”
“-77.12514405000003]”
“6”
“2011-08-2819:07:05”
“我”
“只是”
“放”
“我的”
“生命”
“在”
“像”
“5”
“手提箱”]
您正在尝试对其执行一个rstrip
,而不是单词本身。循环列表访问每个单词并允许您使用rstrip
split()
函数返回一个无法对其执行string
函数的列表。
问题在于按顺序使用这两行
word=line.split() #this will actually return a list of words not just a word
word=word.rstrip(",")
在您的情况下,如果您确定这种格式,您可以这样做:
tweetfile=input("Enter name of tweet file: ")
infile=open(tweetfile,"r",encoding="utf-8")
for line in infile:
line=line.rstrip()
coordinates_string=line.split(']')
coordinates_cleaned = coordinates_string[1:] #removes the [
lat_lon_string = coordinates_cleaned.split(',') #split lat lon
lat = lat_lon_string[0].strip()
lon = lat_lon_string[1].strip()
# convert to float if you would like then after
您的代码有一些地方出错 首先,一般来说,更喜欢使用
和
来打开文件以打开
。您不关闭文件对象,因此在关闭Python之前,操作系统认为它仍然处于打开状态(正在使用中)
其次,split
,当在字符串上运行时,会将其拆分为一个列表
。您希望从所有此类子字符串中去掉逗号,因此需要遍历生成的列表
——在列表
上运行strip
,因为它不是字符串,所以没有意义
最后,以这种方式遍历从文件中读取的文本并重新指定给word
变量不会更改该文本,而只会更改word
变量所指向的内容,因此实际上不会看到任何效果
例如:
>>> numbers = [1, 2, 3, 4, 5]
>>> for i in numbers:
... i += 1
...
>>> numbers
[1, 2, 3, 4, 5]
原因是i
连续指向从1到5的整数。当您对其执行+=
时,您所做的是更改i
指向的对象,而不是获取i
指向的对象并对其进行更改
打个比方:沿着路标到一所房子,然后修剪那里的草坪,然后移动路标指向另一所房子,这两者之间是有区别的
试试这个:
tweet_path = input("Enter name of tweet file: ")
with open(tweet_path, "r", encoding='utf-8') as f:
coordinates = [line.split()[:2] for line in f]
cleaned_coordinates = [(lat[1:-1], lon) for lat, lon in coordinates]
最后,请注意:纬度和经度是
float
,而不是int
,如果需要,您可以相应地转换它们。因为split()
将行拆分为一个单词列表,因此单词
是一个列表。您需要对列表中的每个单词调用rstrip
,而不是对列表本身。这除了重新分配给循环变量外,什么都做不了。@MarcusLim他们仍然需要对单词
执行所需的操作,但它应该可以解决问题他们当前出现的错误?@AmandepPasricha您需要在每个单词上执行它。我编辑了答案,以显示为什么需要它的示例。@ItsPete哦,好吧,我明白了。但是,您能解释一下为什么即使我修复错误并以这种方式执行,这对单词本身也没有影响吗?有人用另一个c解释了这一点OMENT.@AmandepPasricha在循环的迭代过程中,它对单词有影响,但我没有输入任何代码来使用这个单词。我只是修复了您无法调用rstrip
的问题。Marcus Lim说我的代码没有对它执行任何其他操作。@AmandepPasricha我编辑了我对c的回答larify this,您在拆分后使用了rstrip,rstrip需要一个字符串,而split返回一个列表您能解释一下这行吗:coordinates\u cleaned=coordinates\u string[1:]我不太明白这里做了什么。坐标中的字符串部分包含[一开始,你想删除它,这样你就可以在不引起corversion错误的情况下使用这些数字谢了,我现在已经好多了。你说的时候我还是有点困惑“最后,以这种方式遍历从文件读取的文本并重新指定给word变量不会更改该文本,而只会更改word变量所指向的内容,因此您实际上不会看到任何效果“。我不明白为什么我看不到任何效果?嘿,谢谢,我做得更好了。你是说你只是在编辑单词变量(基本上是I),对吗?好的。所以它不会改变行本身的实际代码?它只会在循环中改变它,对吗?