【问题标题】:Why am I getting an AttributeError message?为什么我会收到 AttributeError 消息?
【发布时间】:2019-08-11 18:18:43
【问题描述】:

我有一个名为 tweets.txt 的文件。每一行的格式为:

[纬度,经度]值日期时间文本

文件中包含的数据示例:

[41.298669629999999, -81.915329330000006] 6 2011-08-28 19:02:36 工作需要飞速发展......我很高兴看到 Spy Kids 4 对我的生活充满热爱...... ARREIC
[33.702900329999999, -117.95095704000001] 6 2011-08-28 19:03:13 今天将是我一生中最伟大的一天。受雇在我最好朋友的祖父母 50 周年纪念日拍照。 60位老人。哇。
[38.809954939999997, -77.125144050000003] 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()将该行拆分成一个单词列表,所以words是一个列表。您需要在列表中的每个单词上调用rstrip,而不是在列表本身上。

标签: python attributeerror


【解决方案1】:

您的代码有一些问题。

首先,一般来说,更喜欢使用with 来打开open 的文件。您没有关闭文件对象,因此操作系统认为它仍然处于打开状态(正在使用),直到您关闭 Python。

其次,split,当在字符串上运行时,它拆分为list 的字符串。您想从所有此类子字符串中删除逗号,因此您需要遍历生成的 list - 在 list 上运行 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,您可以根据需要进行相应的转换。

【讨论】:

  • 嘿,谢谢,我现在确实做得更好了。当您说“最后,以这种方式遍历从文件中读取的文本并重新分配给 word 变量不会就地更改该文本,而只会更改 word 变量指向的内容,所以你会”实际上看不到任何效果”。我不明白为什么我看不到任何效果?
  • 嘿,谢谢,我做得更好了。您是说您只是在编辑单词变量(基本上是 i),对吗?好的。所以它不会改变行本身的实际代码?它只会在那个循环中改变它,对吗?
【解决方案2】:

split 将字符串拆分为一个列表。当您需要在每个单词上调用它时,您正在尝试在实际列表上执行rstrip

您可以遍历列表来实现此目的:

for line in infile:  
    line=line.rstrip()  
    for word in line.split():
        word=word.rstrip(",")

或者,您可以像以前一样拆分它并通过索引访问您想要的单词。

澄清:

在您的代码中,split()word 变为:

["[38.809954939999997,",

"-77.125144050000003]",

“6”,

"2011-08-28 19:07:05",

“我”,

“只是”,

“放”,

“我的”,

“生活”,

“在”,

“喜欢”,

“5”,

“手提箱”]

您正在尝试对此执行rstrip,而不是单词本身。在列表中循环访问每个单词并允许您使用rstrip

【讨论】:

  • 除了重新分配给循环变量之外,这不会做任何事情。
  • @MarcusLim 他们仍然需要在word 上执行所需的操作,但它应该修复他们当前遇到的错误?
  • @AmandeepPasricha 您需要对每个单词执行它。我已经编辑了答案,以举例说明为什么需要它。
  • @ItsPete 哦,好吧,我明白了。但是,你能解释一下为什么即使我修复了错误并这样做,这对单词本身没有影响吗?有人在另一条评论中解释了这一点。
  • @AmandeepPasricha 在循环的迭代过程中它对这个词有影响,但我没有输入任何代码来使用这个词。我只解决了您无法拨打rstrip 的问题。 Marcus Lim 说我的代码没有对其执行任何其他操作。
【解决方案3】:

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

【讨论】:

  • @AmandeepPasricha 我编辑了我的答案以澄清这一点,您在拆分后使用了 rstrip,rstrip 需要一个字符串,而 split 返回一个列表
  • 你能解释一下这一行吗:coordinate_cleaned = coordinates_string[1:]。我不太明白这里做了什么。
  • 坐标的字符串部分包含[在开头,您想将其删除,这样您就可以使用数字而不会导致转换错误
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多