Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 14, 2014 02:01:00

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

Есть код, который раньше работал, а теперь перестал.

#coding: utf-8
import csv
def spravka():    	
    def bible(a): # создаем функцию 
    
        reader = csv.reader(open("data.csv", "rb",), delimiter=';')
        name = None
        for first_name, last_name, phone in reader:
            
            if a == phone: 
                name = first_name, last_name
            elif a == first_name: 
                name = last_name, phone
        if name:
            return '{} {}'.format(*name)
        else:
            return None
# добавляем новых персонажей
    b = raw_input('Введите данные: ')
    f = b.split()
    writer = csv.writer(open('data.csv', 'a'), delimiter=';')
    writer.writerow(f)
    while True:
        a = raw_input('Enter seach: ')
        z = bible(a) # присваиваем функцию переменной z
        if a == 'exit': 
            break
        if z:
            print z
        else:
            print 'Phone not found'
spravka()

данные добавляет в файл, а искать не хочет, выдает следующую ошибку

stas@stas-1005PX:~$ python bible.py
Введите данные: 
Enter seach: 1
Traceback (most recent call last):
  File "bible.py", line 34, in <module>
    spravka()
  File "bible.py", line 27, in spravka
    z = bible(a) # присваиваем функцию переменной z
  File "bible.py", line 8, in bible
    for first_name, last_name, phone in reader:
ValueError: need more than 0 values to unpack

рабочий файл приклеплен

Отредактировано stasvoron (Дек. 14, 2014 02:01:39)

Прикреплённый файлы:
attachment data.csv (111 байт)

Офлайн

#2 Дек. 14, 2014 02:56:25

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Не коректно работает код

Уберити пусты строки из вашего csv файла, и все должно заработать.

Офлайн

#3 Дек. 14, 2014 15:17:37

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

Спасибо помогло.

Офлайн

#4 Дек. 14, 2014 16:23:10

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

А как сделать, что бы строки автоматом не учитывались, для ячеек есть strip, а ч для пустых строк?

Офлайн

#5 Дек. 14, 2014 19:37:34

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

я бы весь код написл вот так:

import csv
csv.writer(open('data.csv', 'a'), delimiter=';').writerow(raw_input('Enter data: ').split())
while True:
    a = raw_input('Enter search: ')
    if a == 'exit': break
    print ' '.join(([['Phone not found']] + [i[1:] if a == i[0] else i[:2] for i in csv.reader(open("data.csv", "rb"), delimiter=';') if len(i) == 3 and a in i])[-1])
а вот собственно по вашему вопросу, замените это:
for first_name, last_name, phone in reader:
            
            if a == phone: 
                name = first_name, last_name
            elif a == first_name: 
                name = last_name, phone
на это:
for x in reader:
    if len(x) != 3: continue
    if a == x[2]: 
        name = x[0], x[1]
    elif a == x[0]: 
        name = x[1], x[2]



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Дек. 14, 2014 19:39:56)

Офлайн

#6 Дек. 16, 2014 00:50:37

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

cпасибо работает как положено. Можете рассказать, как именно работает даная строка кода

if len(x) != 3: continue

Офлайн

#7 Дек. 16, 2014 01:17:46

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

доделал код до следующего состояния

#coding: utf-8
import csv
print 'Можно использовать следующие выражения: внести, найти, выход.'
def writer():
    
    f = b.split()
    writer = csv.writer(open('data.csv', 'a'), delimiter=';')
    writer.writerow(f)
while True:
    b = raw_input('Введите данные: ')
    if b == 'выход':
        break
writer()
def bible(a):
    reader = csv.reader(open("data.csv", "rb",),delimiter=';')
    name = None
    for x in reader:
        if len(x) != 3: continue      
        if a == x[2]:
            name = x[0], x[1]
        elif a == x[0]:
            name = x[1], x[2]
    if name:
        return '{} {}' .format(*name)
    else:
        return None
    
while True:
    a = raw_input('Введите запрос: ')
    z = bible(a) # присваиваем функцию переменной z
    if a == 'выход':
        break
    if z:
        print z
    else:
        print 'По заданому запросу иформации не найдено'
z
def vibor():
    v = raw_input('Выберите режим работы: ')
    if  v == 'внести':
        writer()
    elif v == 'найти':
        z
    else:
        exit
vibor()

вото только функция выбор работает только на выход из программы и все, к тому же она запускается в конце, а мне нужно, что бы в начале спрашивало.

Совсем забыл, при выполнении фунции writer в csv файл вносится абсолютно все, даже команда “выход”, возможно ли это как то исправить?
Спасибо за помощь

Отредактировано stasvoron (Дек. 16, 2014 01:41:11)

Офлайн

#8 Дек. 16, 2014 01:19:23

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

голва ща совсем не варит, вот почитайте сами
http://pythonworld.ru/osnovy/cikly-for-i-while-operatory-break-i-continue-volshebnoe-slovo-else.html



————————————————
-*- Simple is better than complex -*-

Офлайн

#9 Дек. 16, 2014 02:05:15

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

#coding: utf-8
import csv
def bible(a):
    if a == 'exit': return True
    reader = csv.reader(open("data.csv", "rb",),delimiter=';')
    name = 'По заданому запросу иформации не найдено'
    for x in reader:
        if len(x) == 3 and a in [x[2], x[0]]:
            x.remove(a)
            name = ' '.join(x)
    print name
def vibor():
    v = raw_input('Выберите режим работы (внести, найти): ')
    if v == 'внести':
        csv.writer(open('data.csv', 'a'), delimiter=';').writerow(raw_input('Введите данные: ').split())
    elif v == 'найти':
        while not bible(raw_input('Введите запрос: ')): pass
vibor()



————————————————
-*- Simple is better than complex -*-

Офлайн

#10 Дек. 16, 2014 17:02:14

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

Спасибо. Ваш способ я по пробую. Обьясните пожалуйта почему не работает мой вариант, по идее ведь должен.

По вашему коду выходит следующее:
- выбор работает, это отлично, дальше по пробую сделать, что бы он появлялся снова по завершению операции (очередной выбор: либо завершить работу программы либо вернуться в главное меню).
- запись в файл производится не с новой строки, а продолжает последнюю существующую, после чего нет возможности найти в файле ни старую информацию (на той строке к которой дописалось), ни свеже добавленую.

Stas;Voron;0631234567
Ivan;Ivanov;0931234567
Vasya;Vasya;0661234567Толстой;Лев;47

проблемму с добавлением прямо в конец строки решил, точнее просто удалил файл и все заработало нормально, хотя не поянтно почему проблемма была.

возврат в меню сделал, работает, но пока не работает выход с программы из меню после его повторного вызова

Отредактировано stasvoron (Дек. 17, 2014 00:44:52)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version