2016-11-10 60 views
0

我想编写func并将其添加到类中。 我用Python:写入类错误

import pandas as pd 
import tldextract 

domain = [] 
df = pd.DataFrame() 
df['urls'] = ['ru.vk.com', 'eng.facebook.com', 'ru.ya.ru'] 
urls = df.urls.values.tolist() 
class csv: 
    def get_domain(self, list_url, list, df): 
     self.list_url = list_url 
     self.list = list 
     self.df = df 
     for i, url in enumerate(list_url): 
      get_domain = tldextract.extract(url) 
      subdomain = get_domain[0] + '.' + get_domain[1] + '.' + get_domain[2] 
      if subdomain.startswith('.'): 
       subdomain = subdomain[1:] 
      elif subdomain.endswith('.'): 
       subdomain = subdomain[:-1] 
      elif subdomain.startswith('www.'): 
       subdomain = subdomain[4:] 
      list.append(subdomain) 
     df['subdomain'] = list 

df = csv() 
df.get_domain(urls, domain, df) 

我尝试从网址获得域名,但我得到的错误

AttributeError: csv instance has no attribute '__setitem__' 

我应该怎么改?

+3

你为什么要在这里上课?它只有一个方法,三个属性可以很容易成为局部变量。 –

+3

嘿,停止使用保留名称作为参数名称。 'list'是python中的内置函数。 – JClarke

+0

是否故意'self.list_url = list_url'和'self.list = list'只复制对原始列表的引用,这些赋值不会创建列表的副本。为此,你需要'copy.deepcopy'(或者一个切片)。 – cdarke

回答

5

你被点名了,你用它来创建csv实例df,相同的数据帧项变量,通过使dfcsv对象,而不是熊猫数据帧。然后,当您尝试拨打get domain时,df引用该类,即无法获取字符串索引,从而失败。


总之 - 在最后2行更改变量的名称,如

csv_df = csv() 
csv_df.get_domain(urls, domain, df) 

顺便说一句,这不是一个错误,但是我最后一行上相当肯定get_domain应该是

self.df['subdomain'] = self.list 

(这适用于所有跨功能的所有变量,因为你渴望改变CL屁股属性,而不是给定的变量)。

而且您不应该命名变量list或任何其他保留关键字。可能会导致问题。

+0

我喜欢不使用类的建议,只更好地定义方法。 –

0

我不知道你应该改变什么,但你绝对不应该在get_domain方法中使用get_domain变量。从这开始,然后看看它是否能解决任何问题。

(该get_domain功能是在类的第二行,并且get_domain变量是在类的第6行)

编辑:还有一两件事,在该方法的代码没有任何相关性我们称之为测试数据。这可能是错的,也可能是对的,但你不知道。