2017-01-14 10 views
-1

私は友人のPython 'Twitch account checker'(基本的にテキストファイルからユーザー名のリストを取得し、Twitch.tvで利用可能かどうかをチェックする)を改善しようとしていました。私は利用可能なユーザー名を(元のリストと同じ場所にある)テキストファイルに出力するように改良しようとしていました。私は実際にStack Overflowを検索していましたが、実際にリストを出力する方法(別のリストに利用可能なユーザー名を入力する方法)をテキストファイルに「説明した」ポストが見つかりました。リストをテキストファイルとして出力する

スクリプトを実行すると、利用可能なユーザー名を保存する部分まで正常に動作します。 jonrsharpeはsplit、言ったように

def output_available_usernames(filename): 
    global AVAILABLE_USERNAMES 
    with open(filename, 'w') as f: 
     for name in AVAILABLE_USERNAMES: 
      f.write(name + '\n') 

:その後、私は次のエラーを取得する:

Traceback (most recent call last): 
    File "multithreadtwitchchecker.py", line 44, in <module> 
    output_available_usernames('availableusernames.txt') 
    File "multithreadtwitchchecker.py", line 37, in output_available_usernames 
    AVAILABLE_USERNAMES = f.write(AVAILABLE_USERNAMES.split('\n')) 
AttributeError: 'list' object has no attribute 'split' 

ここでは、コードです:

from multiprocessing.pool import ThreadPool 
import re 
import requests 
import sys 

try: 
    input = raw_input 
except NameError: 
    pass 

TWITCH_URL = "https://www.twitch.tv/{username}" 
TWITCH_REGEX = re.compile(r"^[a-zA-Z0-9_]{4,25}$") 
MAX_THREADS = 25 
MESSAGES = {True: "Available", False: "Taken"} 
AVAILABLE_USERNAMES = [] 

def read_valid_usernames(filename): 
    """Reads a list of usernames and filters out invalid ones.""" 
    try: 
     with open(filename, "r") as fin: 
      return [username for username in map(str.strip, fin) if TWITCH_REGEX.match(username)] 
    except IOError: 
     sys.exit("[!] '{}' - Invalid File".format(filename)) 

def username_available(username): 
    """Checks if a 404 response code is given when requesting the profile. If it is, it is presumed to be available""" 
    try: 
     return username, requests.get(TWITCH_URL.format(username=username)).status_code == 404 
     AVAILABLE_USERNAMES.append(username) 
    except Exception as e: 
     print(e) 

def output_available_usernames(filename): 
    """Gets a filename to output to and outputs all the valid usernames to it""" 
    global AVAILABLE_USERNAMES 
    f = open(filename, 'w') 
    AVAILABLE_USERNAMES = f.write(AVAILABLE_USERNAMES.split('\n')) 

usernames = read_valid_usernames(input("Enter path to list of usernames: ")) 

for username, available in ThreadPool(MAX_THREADS).imap_unordered(username_available, usernames): 
    print("{:<{size}}{}".format(username, MESSAGES.get(available, "Unknown"), size=len(max(usernames, key=len)) + 1)) 

output_available_usernames('availableusernames.txt') 
+1

まず、既にリストになっているものを「分割」しようとしています。次に、文字列ではないオブジェクトを最初に変換せずにファイルに書き込もうとしています。 – TigerhawkT3

+0

@ TigerhawkT3よろしくお願いいたします。あなたが正しい解決策を知っているなら、答えとして投稿してください!私はこれを自分で修正しようとしますが、私はそれを手に入れることはできません。 –

+0

'.split'が間違った方向に向いているようです... – jonrsharpe

答えて

1

まあは、ファイルへの書き込みを次のように行うことができます間違った方向に行きます。

しかし、あなたのコードは今より深刻な問題を抱えています。 AVAILABLE_USERNAMESの後にreturnステートメントが追加されるため、コードは実行されず、AVAILABLE_USERNAMESは常に空になります。代わりに、次のようなものが必要です:

def username_available(username): 
    """Checks if a 404 response code is given when requesting the profile. If it is, it is presumed to be available""" 
    try: 
     if requests.get(TWITCH_URL.format(username=username)).status_code == 404: 
      AVAILABLE_USERNAMES.append(username) 
      return username, True 
     else: 
      return username, False 
    except Exception as e: 
     print(e) 
+0

[プロセスが状態を共有しない]ため、グローバル変数の使用を避けるためにコードを再作成することもお勧めします(http://stackoverflow.com/questions/11109776/changing-global-variable-when-multiprocessing -in-python)、グローバル変数はPythonでは一般的に推奨されていません。代わりに 'for'ループの中で(' print'文の後に) 'available'値を調べるようなことをすることができます。 – pbaranay

+0

ありがとうございます。私はあなたの提案を読んでコードを実装し、それは完全に動作します!また、@ jonrsharpeのおかげです。 –

関連する問題