Как создать цикл для входной зависимой функции в Python? - PullRequest
0 голосов
/ 06 июля 2019

Я наконец-то освоил Python и начал ежедневно использовать его на работе. Тем не менее, кривая обучения по-прежнему крутая, и я наткнулся на контрольно-пропускной пункт в попытке что-то новое с кодом, который я нашел здесь для удаления членов из каналов телеграммы.

В настоящее время в строках 38-44 мы можем выбрать группу из списка, и она будет очищать пользовательские данные в 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 при каждой итерации, но я планирую изменить его так, чтобы он выводился в уникальные файлы.

Итак, возвращаясь к моему вопросу. Как мне сделать этот цикл итерации одной программы по всем группам, или просто выбрать все из них.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Закончилось выяснение проблемы:

При присвоении имени 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/).

Ура!

0 голосов
/ 06 июля 2019

Не могу проверить это, но может быть что-то подобное? Это создает новый файл .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.")
...