私は友人の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')
まず、既にリストになっているものを「分割」しようとしています。次に、文字列ではないオブジェクトを最初に変換せずにファイルに書き込もうとしています。 – TigerhawkT3
@ TigerhawkT3よろしくお願いいたします。あなたが正しい解決策を知っているなら、答えとして投稿してください!私はこれを自分で修正しようとしますが、私はそれを手に入れることはできません。 –
'.split'が間違った方向に向いているようです... – jonrsharpe