@true1337hax
Новичок в программировании

Не записывает в файл?

В общем, не записывает у меня это в файл.
Сам файл создался, но записей в нем нету.
Что я не так сделал в коде?
group = vk.groups.getMembers(group_id=162966684, fields=['first_name, last_name, online, sex'])
    
    for item in group['items']:
        name = item['first_name']
        lname = item['last_name']
        online = item['online']
        iduser = item['id']
        sex = item['sex']
        if sex == 1: #Если пол женский
            sex = 'Жен' 
            if sexselect == '2': #Если выбрал сортировку по жен. полу
                if online == 0:
                    #online = 'Не в сети' - Если вам нужно отображать людей которые не в сети
                    pass
                else:
                    online = 'В сети'
                    print('|', name, lname, '|', 'id' + str(iduser), '|', 'Пол:', sex, '|', '==>', online)
            elif sexselect == '0':
                if online == 0:
                    #online = 'Не в сети' - Если вам нужно отображать людей которые не в сети
                    pass
                else:
                    online = 'В сети'
                    print('|', name, lname, '|', 'id' + str(iduser), '|', 'Пол:', sex, '|', '==>', online)
            else:
                pass
        else: #Если пол мужской
            sex = 'Муж'
            if sexselect == '1': #Если выбрали сортировку по муж. полу
                if online == 0:
                    #online = 'Не в сети' - Если вам нужно отображать людей которые не в сети
                    pass
                else:
                    online = 'В сети'
                    print('|', name, lname, '|', 'id' + str(iduser), '|', 'Пол:', sex, '|', '==>', online)
            elif sexselect == '0':
                if online == 0:
                    #online = 'Не в сети' - Если вам нужно отображать людей которые не в сети
                    pass
                else:
                    online = 'В сети'
                    f = open('result.txt', 'w')
                    res = print('|', name, lname, '|', 'id' + str(iduser), '|', 'Пол:', sex, '|', '==>', online)
                    f.write(name, lname, online, iduser)
                    f.close
            else:
                pass

Помогите пожалуйста, и не нужно писать в ответах что я рак в питоне и т.д, просто прошу помочь.
И учить мне не надо советовать и т.д.
Просто
Помогите
  • Вопрос задан
  • 1448 просмотров
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Во-первых, f.close() Во-вторых, f = open('result.txt', 'a') В-третьих,
f.write('\t'.join(map(str, [name, lname, online, iduser])))
Ответ написан
Артем Марш, в коде полно ошибок:
  1. После первой строки не нужен отступ(4 пробела перед for ...)
  2. Не понятно, какая необходимость извлекать сведения из словаря в переменные? (name = item['first_name'], ...)
  3. Дуплицирование кода
    print('|', name, lname, '|', 'id' + str(iduser), '|', 'Пол:', sex, '|', '==>', online)
    . Во всех случаях одно и то же, и поэтому печать на экран можно вывести из блока if sex == 1
  4. Запись в файл лучше оформить через контекст, т.е. через with
  5. И самое главное!
    Сам файл создался, но записей в нем нету.
    . Файл Вы открываете на запись, а не на добавление. Получается при каждом проходе цикла файл перезаписывается без сохранения предыдущих результатов. Режим для добавления строк в файл:f = open('result.txt', mode='a')
  6. Проверка связанная с полом, несколько переусложнена. Лучше подобные проверки выводить в функции для чистоты кода. Не буду писать подробнее, т.к. потребует еще большего времени для объяснения


По поводу вопроса в комментарии к ответу Сергей Горностаев:
  1. Какой смысл в преобразовании str в bytes при записи?(.encode('utf-8')) Чтобы при чтении преобразовать обратно в строку Unicode?! По мне, так логичнее так и хранить в Unicode. При открытии файла на запись указать кодировку:
    with open('result.txt', encoding='utf-8') as f:
        ...

  2. Ошибка TypeError: sequence item 3: expected str instance, int found выводится, т.к. аргументами метода join должны быть коллекция из строк(str). А переменная iduser типа int(целое число). Нужно преобразовать перед передачей в join: '\t'.join([ name, lname, online, str(iduser)])

Вот код для записи:
with open('result.txt', encoding='utf-8', mode='a') as f:
    f.write('\t'.join([ name, lname, online, str(iduser)]))

или
f = open('result.txt', encoding='utf-8', mode='w')
for item in group['items']:
    ...
        f.write('\t'.join([ name, lname, online, str(iduser)]))
    ...
f.close()


P.S. И маленький совет не связанный с ошибками. Формат в котором Вы записываете в файл напоминает CSV. Поменяйте:
  1. расширение файла на csv
  2. разделитель вместо таба(/t) используйте точку с запятой (;)
  3. и первыми строчками можете добавить заголовки для полей (расшифровка полей)

И можете смотреть в файл в табличных редакторах(Excel, ...), подвергать в них анализу, сортировке, ...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы