Python 将列表输出为文本文件
我试图改进我朋友的Python“Twitch帐户检查器”(基本上是从文本文件中获取用户名列表,并检查它们是否在Twitch.tv上可用)。我打算改进它,将可用用户名输出到文本文件中(与原始列表位于同一位置)。我实际上是在搜索堆栈溢出,发现了一篇文章,其中“解释”了如何将列表(我将可用用户名放入单独的列表)输出到文本文件中 在运行脚本时,它可以很好地工作到应该保存可用用户名的部分。然后,我得到以下错误:Python 将列表输出为文本文件,python,Python,我试图改进我朋友的Python“Twitch帐户检查器”(基本上是从文本文件中获取用户名列表,并检查它们是否在Twitch.tv上可用)。我打算改进它,将可用用户名输出到文本文件中(与原始列表位于同一位置)。我实际上是在搜索堆栈溢出,发现了一篇文章,其中“解释”了如何将列表(我将可用用户名放入单独的列表)输出到文本文件中 在运行脚本时,它可以很好地工作到应该保存可用用户名的部分。然后,我得到以下错误: Traceback (most recent call last): File "mult
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'
回溯(最近一次呼叫最后一次):
文件“multi-threadtwitchchecker.py”,第44行,在
输出可用用户名('availableusernames.txt')
文件“multi-threadtwitchchecker.py”,第37行,在输出\u可用\u用户名中
AVAILABLE_USERNAMES=f.write(AVAILABLE_USERNAMES.split('\n'))
AttributeError:“list”对象没有属性“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')
从multiprocessing.pool导入线程池
进口稀土
导入请求
导入系统
尝试:
输入=原始输入
除名称错误外:
通过
TWITCH_URL=”https://www.twitch.tv/{username}”
TWITCH_REGEX=re.compile(r“^[a-zA-Z0-9{4,25}$”)
最大螺纹数=25
消息={True:“可用”,False:“已获取”}
可用的_用户名=[]
def read_有效_用户名(文件名):
“”“读取用户名列表并筛选出无效的用户名。”“”
尝试:
打开(文件名为“r”)作为fin:
返回[如果TWITCH_REGEX.match(用户名)匹配,则映射中用户名的用户名(str.strip,fin)]
除IOError外:
sys.exit(“[!]”{}“-无效文件”。格式(文件名))
def用户名\u可用(用户名):
“”“检查请求配置文件时是否给出了404响应代码。如果是,则假定该代码可用”“”
尝试:
返回用户名,requests.get(TWITCH_URL.format(username=username))。状态_代码==404
可用的\u用户名。附加(用户名)
例外情况除外,如e:
打印(e)
def输出\可用\用户名(文件名):
“”“获取要输出到的文件名,并向其输出所有有效用户名”“”
全局可用\u用户名
f=打开(文件名为“w”)
AVAILABLE_USERNAMES=f.write(AVAILABLE_USERNAMES.split('\n'))
用户名=读取\有效\用户名(输入(“输入用户名列表路径:”)
对于用户名,在线程池中可用(最多线程)。imap\u无序(用户名可用,用户名):
打印(“{:嗯,写入文件可以这样做:
def output_available_usernames(filename):
global AVAILABLE_USERNAMES
with open(filename, 'w') as f:
for name in AVAILABLE_USERNAMES:
f.write(name + '\n')
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)
正如Jornsharpe所说,split
走错了方向
但是,您的代码现在有一个更深层次的问题。您在return
语句之后附加到AVAILABLE\u USERNAMES
,这样代码就永远不会执行,AVAILABLE\u USERNAMES
将始终为空。您希望这样:
def output_available_usernames(filename):
global AVAILABLE_USERNAMES
with open(filename, 'w') as f:
for name in AVAILABLE_USERNAMES:
f.write(name + '\n')
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)
首先,您试图将
拆分为一个列表—一些已经是列表的东西。其次,您试图将一个不是字符串的对象写入一个文件,而不先将其转换。@TigerhawkT3好的,谢谢您。如果您知道正确的解决方案,请将其作为答案发布!我将尝试自己修复此问题,但我不确定是否能得到解决在我看来,.split
会走错方向…使用“,”.join(AVAILABLE\u USERNAMES)
创建一个字符串,然后将其写入文件。不要这样做AVAILABLE\u USERNAMES=f.write(…)
因为AVAILABLE\u USERNAMES
中的数据丢失了,因为write()
返回写入的字符数。@furas我已经使用了您建议的所有内容,现在脚本运行时没有任何错误!非常感谢!但是,它创建的文本文件是空的。下面是函数的新代码:我还建议重新编写代码,以避免使用全局变量,因为全局变量是泛型的ally在Python中不受欢迎。你可以在最后的for
循环中(在print
语句之后)检查可用的值。谢谢。我已经阅读了你的建议并实现了代码,它工作得非常好!还有,感谢@jornsharpe