Форум сайта python.su
0
Есть код, который раньше работал, а теперь перестал.
#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)
Прикреплённый файлы:
data.csv (111 байт)
Офлайн
34
Уберити пусты строки из вашего csv файла, и все должно заработать.
Офлайн
0
Спасибо помогло.
Офлайн
0
А как сделать, что бы строки автоматом не учитывались, для ячеек есть strip, а ч для пустых строк?
Офлайн
103
я бы весь код написл вот так:
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]
Отредактировано terabayt (Дек. 14, 2014 19:39:56)
Офлайн
0
cпасибо работает как положено. Можете рассказать, как именно работает даная строка кода
if len(x) != 3: continue
Офлайн
0
доделал код до следующего состояния
#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()
Отредактировано stasvoron (Дек. 16, 2014 01:41:11)
Офлайн
103
голва ща совсем не варит, вот почитайте сами
http://pythonworld.ru/osnovy/cikly-for-i-while-operatory-break-i-continue-volshebnoe-slovo-else.html
Офлайн
103
#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()
Офлайн
0
Спасибо. Ваш способ я по пробую. Обьясните пожалуйта почему не работает мой вариант, по идее ведь должен.
По вашему коду выходит следующее:
- выбор работает, это отлично, дальше по пробую сделать, что бы он появлялся снова по завершению операции (очередной выбор: либо завершить работу программы либо вернуться в главное меню).
- запись в файл производится не с новой строки, а продолжает последнюю существующую, после чего нет возможности найти в файле ни старую информацию (на той строке к которой дописалось), ни свеже добавленую.
Stas;Voron;0631234567 Ivan;Ivanov;0931234567 Vasya;Vasya;0661234567Толстой;Лев;47
Отредактировано stasvoron (Дек. 17, 2014 00:44:52)
Офлайн