2017-02-13 5 views
0

私はPythonが初めてです。私は、複数のGoogleアナリティクスプロファイルから一部のデータをエクスポートするための新しいスクリプトを作成しました。しかし、それは非常にひどく書かれていると確信しています。各ループの後に私のリストを空にするより良い方法はありますか?

私はそれを改善するためにどこを開始するのか本当にわからないので、ここに私の最初の質問です。

プロファイルIDのリストをループしています。各プロフィールIDについて、私はappendメソッドを使用しているいくつかのアクションを実行しました。だから私はいくつかのリストを段階的に構築していますが、最後にこれらのリストをリセットする必要があります。だから私はコードの始めと終わりにこのようなものを持っています:

fullurllist = [] 
urllist = [] 
share = [] 
sharelist = [] 
sharelist1 = [] 
end_list = [] 

私はこれを避けるべきだと思います。私のコードのすべてのロジックを変更する必要がありますか?この面を改善するために私ができることは他にありますか?ここで

はコードです:

# Loop through the profiles_list and get the best pages for each profile 
    for profile in profiles_list: 
    response = service.data().ga().get(
     ids='ga:' + profile, 
     start_date='1daysAgo', 
     end_date='today', 
     metrics='ga:sessions', 
     dimensions='ga:pagePath', 
     sort='-ga:sessions', 
     filters='ga:sessions>400').execute() 

    # Catch response. 
    rawdata = response.get('rows', []) 

    # Flatten response (which is a list of lists) 
    for row in rawdata: 
     urllist.append(row[0]) 

    # Building a list of full url (Hostname + Page path) 
    fullurllist = [urljoin(base, h) for h in urllist] 

    # Scraping some data from the url list 
    for url in fullurllist: 

     try: 
      page = urllib2.urlopen(url) 
     except urllib2.HTTPError as e: 
       if e.getcode() == 404: # eheck the return code 
        continue 
     soup = BeautifulSoup(page, 'html.parser') 

     # Take out the <div> of name and get its value 
     name_box = soup.find(attrs={'class': 'nb-shares'}) 
     if name_box is None: 
     continue 
     share = name_box.text.strip() # strip() is used to remove starting and trailing 

     # save the data in tuple 
     sharelist.append(url) 
     sharelist1.append(share) 

     # Format the data scraped 
     end_list = [int(1000*float(x.replace('k', ''))) if 'k' in x else int(x) for x in sharelist1] 

    #export in csv 
    csv_out = open(response.get('profileInfo').get('profileName') + '.csv', 'wb') 
    mywriter = csv.writer(csv_out) 
    for row in zip(sharelist, end_list): 
     mywriter.writerow([row]) 
    csv_out.close() 

    #reset list 
    fullurllist = [] 
    urllist = [] 
    share = [] 
    sharelist = [] 
    sharelist1 = [] 
    end_list = [] 

どうもありがとう!

+2

繰り返しのものを関数で囲みます。このようなタスクは自動的に処理されます。 – kawadhiya21

+2

これらのうちのいくつかは必要でさえありません。例えば、 'fullurllist'は' fullurllist = [urljoin(h、urllistのhのための基底、h)] 'で作成されていますので、' fullurllist'がポピュレートされているのか空でないのか、単にその名前と以前の参照に割り当てるだけで失われます。 – TigerhawkT3

+0

すべてのリストが必要ですか?例えば、 'urllist'は、' fullurllist'にデータを入れるのとは別に使われていないようですが、あなたの出力の一部ではないようです。 – asongtoruin

答えて

0

より適切なのは、forループの先頭にあり、外側ではなく宣言(fullurlllist = [])を行うことです。 これらはループの中だけで生きていなければなりません

+1

賢いニックピット:Pythonは変数*宣言*の概念を持っていません。むしろ、それらが最初に割り当てられた時点で存在します。 –

関連する問題