2016-11-10 20 views
0

funcを記述してクラスに追加します。 私はのURLからドメインを取得しようと、私は、私は変更する必要がありますどのようなエラーPython:クラスの書き込みでエラーが発生しました

AttributeError: csv instance has no attribute '__setitem__' 

を得る?

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) 

を使用

+3

なぜここでクラスを使用していますか? 1つのメソッドしかないので、3つの属性はローカル変数と同じように簡単にできます。 –

+3

パラメータ名として予約名を使用して停止してください。 'list'はPythonの組み込みです。 – JClarke

+0

'self.list_url = list_url'と' self.list = list'は元のリストへの参照のみをコピーすることを意図していますが、これらの割り当てはリストのコピーを作成しません。そのためには、 'copy.deepcopy'(またはスライス付きのハック)が必要です。 – cdarke

答えて

5

あなたはdfcsv対象としませパンダのデータフレームを参照することによって、そのデータフレームの項目と同じcsvインスタンスdfを作成するために使用する変数の名前。その後、get domainを呼び出すと、dfがクラスを参照するため、文字列インデックスを取得できないため、失敗します。要するに


は - ところで

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

のように、最後の2行に変数名を変更し、それは間違いではないのですが、私は最後の行にかなり確信していますget_domainをすることになった

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

(あなたはCLを変更することを望むので、同じことが、すべての機能全体のすべての変数のために行きますassのプロパティであり、与えられた変数ではありません)。

また、変数名にはlistまたは他の予約語を使用しないでください。問題を引き起こす可能性があります。

+0

私はクラスを使用せず、メソッドをよりよく定義することを勧めます。 –

0

他に何を変更すべきかわかりませんが、get_domainメソッド内でget_domain変数を使用しないでください。これから始めて、それが何かを解決するかどうかを見てください。

(get_domain関数は、クラスの2行目にあり、get_domain変数は、クラスの6行目にある)

編集:そしてもう一つ、メソッド内のコードは、全く関連性を有していませんの値に...テストデータと呼ぶことにしよう。それは間違っているかもしれませんが、正しいかもしれませんが、あなたは分かりません。

関連する問題