如何从 Python 中的输入相关函数创建 for 循环?

How to create a for loop from a input dependent function in Python?

我终于掌握了 Python 的诀窍,并开始每天在工作中使用它。然而,学习曲线仍然很陡峭,我在尝试使用我发现 here 从电报频道中抓取成员的代码尝试新事物时遇到了障碍。

目前在第 38-44 行,我们可以 select 列表中的一个组,它将把用户数据抓取到 members.csv 中。

编辑:解决了 CSV 命名问题:


    print('Saving In file...')
    print(target_group.title)
    filename = target_group.title 
    with open(("{}.csv".format(filename)),"w",encoding='UTF-8') as f:

我想创建一个 for 循环来遍历列表中的每个组,而不是依赖于输入。

print('Choose a group to scrape members from:')
i=0
for g in groups:
    print(str(i) + '- ' + g.title)
    i+=1 
g_index = input("Enter a Number: ")
target_group=groups[int(g_index)]

问题是我不确定如何用for循环替换这部分代码。

尽管将其更改为 for 循环只会使其在每次迭代时覆盖相同的 members.csv 文件,但我计划对其进行更改,以便它输出到唯一的文件中。

所以回到我的问题。我如何使这个单一程序迭代循环遍历所有组,或者只是 select 所有组。

感谢您的帮助!

无法测试这个,但也许是这样的?这将为每个组创建一个新的 .csv 文件。

for chat in chats:
    try:
        if chat.megagroup == True:
            groups.append(chat)
    except:
        continue

for current_group in groups:

    print(f"Fetching members for group \"{current_group.title}\"...")
    all_participants = client.get_participants(current_group, aggressive=True)

    current_file_name = f"members_{current_group.title}.csv"

    print(f"Saving in file \"{current_file_name}\"...")
    with open(current_file_name, "w+", encoding="UTF-8") as file:
        writer = csv.writer(file, delimiter=",", lineterminator="\n")
        writer.writerow(["username", "user id", "access hash", "name", "group", "group id"])
        for user in all_participants:
            username = user.username if user.username else ""
            first_name = user.first_name.strip() if user.first_name else ""
            last_name = user.last_name.strip() if user.last_name else ""
            name = f"{first_name} {last_name}"
            row = [username, user.id, user.access_hash, name, current_group.title, current_group.id]
            writer.writerow(row)
    print(f"Finished writing to file \"{current_file_name}\".")
print("Members scraped successfully.")

最终解决了问题:

关于命名CSV文件: 使用title属性命名文件并在字符串中替换。

g_index = chat_num
target_group=groups[int(g_index)]
filename = target_group.title 
print('Fetching Members from {} ...'.format(filename))
all_participants = []
all_participants = client.get_participants(target_group, aggressive=True)

print('Saving In file...')
with open(("{}.csv".format(filename)),"w",encoding='UTF-8') as f:

关于为序列创建 for 循环: 原始代码(发布在问题中)不包含 for 循环。我的解决方法是从所有内容创建一个函数,然后遍历一个索引列表,该列表等于检测到的实例数量。最后看起来像这样:

chat_list_index = list(range(len(chats)))

for x in chat_list_index:
    try: 
        get(x)
    except:
        print("No more groups.", end = " ")
        pass
    pass
print("Done")

总的来说,这可能不是实现我所寻求的目标的最佳解决方案,但它现在对我来说已经足够好了,而且我学到了很多东西。也许将来有人会发现这很有用。此处提供完整代码:(https://github.com/ivanstruk/telegram-member-scraper/).

干杯!