Найти - Пользователи
Полная версия: Не коректно работает код
Начало » Python для новичков » Не коректно работает код
1 2 3 4
stasvoron
Есть код, который раньше работал, а теперь перестал.

#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

рабочий файл приклеплен
GreyZmeem
Уберити пусты строки из вашего csv файла, и все должно заработать.
stasvoron
Спасибо помогло.
stasvoron
А как сделать, что бы строки автоматом не учитывались, для ячеек есть strip, а ч для пустых строк?
terabayt
я бы весь код написл вот так:
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]
stasvoron
cпасибо работает как положено. Можете рассказать, как именно работает даная строка кода
if len(x) != 3: continue
stasvoron
доделал код до следующего состояния

#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 файл вносится абсолютно все, даже команда “выход”, возможно ли это как то исправить?
Спасибо за помощь
terabayt
голва ща совсем не варит, вот почитайте сами
http://pythonworld.ru/osnovy/cikly-for-i-while-operatory-break-i-continue-volshebnoe-slovo-else.html
terabayt
#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()
stasvoron
Спасибо. Ваш способ я по пробую. Обьясните пожалуйта почему не работает мой вариант, по идее ведь должен.

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

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

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

возврат в меню сделал, работает, но пока не работает выход с программы из меню после его повторного вызова
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB