Форум сайта python.su
0
Народ, знаю, что подобные вопросы разбирались, но то, что удалось найти не помогло. У меня есть скрипт, который берёт данные с сервака и записывает в файл. Проблема в том, что он не добавляет новые записи, а просто каждый раз записывает все имеющиеся данные по новой. К тому же сам файл приходится дозаполнять ручками. Пример:
Иванов 2334345
Петров 6888998
Цифры забиваются руками. После выполнения скрипта хотелось бы иметь резутьтат:
Иванов 2334345
Петров 6888998
Сидоров
А получается:
Иванов 2334345
Петров 6888998
Иванов
Петров
Сидоров
Как поправить код, чтоб он сравнивал содержимое строк, например, до второго таба, и удалял дубли? Много модификаций делала, код просто игнорится. Вот последнее “творение”:
f=open("test.txt", "a+") for r in res: m=r[1]['uid'][0] f.write('*\t' + m + '\n') lines=open("test.txt", "r").readlines() array = [] for i in range(len(lines)): if array.count(lines[i]) != 0: del lines[i] f.close()
Офлайн
857
Нужно загрузить сначала имена из файла, а потом брать с сервера имена и отбрасывать те, которые уже есть в загруженных из файла. То, что останется, сохранять в файл.
Офлайн
0
Ммм… Не совсем ясно, из какого файла? То есть сравнивать записи существующего файла с результатом обращения к серверу и запись вести в ещё один файл? 
Офлайн
857
В тот же самый файл вести запись. Файл можно как один раз открыть и читать из него и писать в него, так и несколько раз открывать то на чтение, то на запись.
Вместо a+ используй r+.
Отредактировано py.user.next (Сен. 17, 2016 01:10:08)
Офлайн
0
Хм, поменяла код. Почему-то у меня не проходит del - в смысле он ничего не удаляет
open_file = open('test.txt', 'r') line = open_file.readline() name = line.strip() Dict = {} def find_duplicate(): for name in open_file: if Dict.has_key(name): Dict[name] += 1 else: Dict[name] = 1 find_duplicate() for name in Dict: if Dict[name] > 1: del name open_file.close()
Офлайн
221
потому что вы удаляете переменную name, а не элемент словаря Dict
Офлайн
Syslik
задача ваша ИМХО для sqlite - перезаписью файлов потеряете данные
ну если по простому
from collections import OrderedDict f = open('test.txt','w+') f.write('aa 123\n') f.write('aa\n') f.write('bb\n') f.write('bb 234\n') f.write('cc') f.close() f = open('test.txt') d = OrderedDict() lines = f.readlines() f.close() for line in lines: l = line.strip().split() if len(l) > 1: d[l[0]] = l[1] elif not l[0] in d: d[l[0]] = '' for i in d: print i, d[i]
Отредактировано vic57 (Окт. 6, 2016 18:06:52)
Офлайн
0
проблема в том, что скрипт у меня запускается каждый день, а поэтому в данном случае 1:
aa 123
bb 234
cc
2:
aa 123
bb 234
ccaa 123
cc
Ерундень какая-то. Хорошо, пусть в файл запись вместе с дублями идёт. Как потом отдельно открыть его и убрать повторы?
пыталась вместо del name вставить del Dict - or name in Dict:
RuntimeError: dictionary changed size during iteration (тут должен быть плачущий смайл, но я оставлю это (____|____))
Офлайн
в моем коде просто после строки ‘cc’ нет ‘ \n’ - перевод строки. Будьте внимательней
Убрать повторы :
f = open('test.txt'] l = f.readlines() f.close() d = OrderedDict().fromkeys(l).keys() for i in d: print i,
Отредактировано vic57 (Окт. 10, 2016 20:28:47)
Офлайн
0
Ничего не могу понять… Может, у меня что-то с файлом. Даже средства bash не помогают.
$ sort -u old_file > new_file
иль
$ awk '!x++' old_file > new_file
Офлайн