Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 13, 2014 02:51:36

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

написал я прогу чтоб скачивала с rss торрент файлы вот код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import feedparser
import collections
import shelve
import os.path
from urllib import request
LINK = 'http://torrentrss.net/getrss.php?rsslink=Lxye6Z' #вставляем свою ссылку с http://torrentrss.net/
folder_to_save = '~/TDownload/torrent'					#куда сохранять торрент файлы
folder_to_save =  os.path.expanduser(folder_to_save)
data_file = 'data.she'									#название файла shelve
TORRENTS = collections.namedtuple('Torrents', 'serial series torrent_url torrent_name')
def torrent_nametuple(f):
	serial = f['summary_detail']['value']
	series = f['title']
	series = series.replace('Финал','').replace('Сезона','').replace('сезона','').replace('WEBDLRip','').replace('|','').replace('/','').strip()
	torrent_name = "{}_{}.torrent".format(serial,series.replace('.',''))
	torrent_url = f['link']
	return TORRENTS(serial,series,torrent_url,torrent_name)
def main():
	print('\n'*10)
	d = shelve.open(data_file)
	
	feed = feedparser.parse( LINK )
	for f in feed['entries'][::-1]:				#делаем итерацию по данным в rss
		torrent = torrent_nametuple(f)		
		try:
			serial_dict = d[torrent.serial] #переходим к dict сериала
		except KeyError:					#если нету ещо такого сериала
			d[torrent.serial] = {}			#создаем новый dict
			serial_dict = d[torrent.serial]	#и даем сылку на него
			
		if  serial_dict.pop(torrent.series, None) is not None:
			continue						#значит уже ету серию скачало
		else:
			print("качаю новый файл:\n  {}\n      {}".format(torrent.serial,torrent.series))
			request.urlretrieve( torrent.torrent_url , os.path.join(folder_to_save,torrent.torrent_name) )
			print("файл скачан добавляю его данные в базу...")
			serial_dict[torrent.series] = torrent
		
	d.close()
	return 0
if __name__ == '__main__':
	main()
каждый раз загружаются все торрент файлы, вроде бы все по документации сделал
https://docs.python.org/3.4/library/shelve.html
помогите

Отредактировано simple_user (Авг. 13, 2014 02:52:19)

Офлайн

#2 Авг. 14, 2014 22:15:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

simple_user
d = shelve.open(data_file)

d = shelve.open(data_file, writeback=True)

Отредактировал main(), чтобы качалось один раз.

def main():
    #print('\n'*10)
    d = shelve.open(data_file, writeback=True)
 
    feed = feedparser.parse( LINK )
    for f in feed['entries'][::-1]:             #делаем итерацию по данным в rss
        torrent = torrent_nametuple(f)
         
        if torrent.serial in d:
            serial_dict = d[torrent.serial]
        else:
            serial_dict = d[torrent.serial] = {}
         
        #try:
        #    serial_dict = d[torrent.serial] #переходим к dict сериала
        #except KeyError:                    #если нету ещо такого сериала
        #    d[torrent.serial] = {}          #создаем новый dict
        #    serial_dict = d[torrent.serial] #и даем сылку на него
 
        #if  serial_dict.pop(torrent.series, None) is not None:
        #    continue                        #значит уже ету серию скачало
        #else:
 
        loadfmt = "качаю новый файл:\n  {}\n      {}"
 
        if torrent.series not in serial_dict:
            print(loadfmt.format(torrent.serial, torrent.series))
 
            request.urlretrieve(
                torrent.torrent_url,
                os.path.join(folder_to_save, torrent.torrent_name)
            )
            serial_dict[torrent.series] = tuple(torrent)
 
            print("файл скачан добавляю его данные в базу...")
 
    d.close()
    return 0



Отредактировано py.user.next (Авг. 14, 2014 22:33:11)

Офлайн

#3 Авг. 18, 2014 19:37:13

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

благодарочка
жаль что уже реализовал по другому алгоритму ( проверяю есть ли файл в папке, если нету качаю )

Офлайн

#4 Авг. 19, 2014 00:09:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

simple_user
проверяю есть ли файл в папке

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



Офлайн

#5 Авг. 19, 2014 23:04:22

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

py.user.next
Вообще, надо сначала закачать файл, а потом добавить в базу. Если будет разрыв соединения во время скачивания файла, часть файла останется.
торрент програма когда “поймала” файл добавляет к нему в конец “.added” соответсвенно я проверяю если файл с этой концовкой в папке, а не иходник
на сколько я понимаю, если програма “не словит” она концовку не добавит, и при следующем запуске скрипта, этот файл перезапишется

Офлайн

#6 Авг. 19, 2014 23:44:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

simple_user
торрент програма когда “поймала” файл добавляет к нему в конец “.added”

То, что происходит дальше с файлами, не должно учитываться. Функция скрипта в чем? В том, чтобы скачать файлы, которые ещё не скачаны. Нужно представлять, что больше ничего нет, нет программ никаких.

simple_user
если програма “не словит” она концовку не добавит

Сегодня она добавляет, завтра ты её обновил, она перестала добавлять. Ты об этом не узнал, скрипт работает наполовину. Потом ты узнал, скрипт нужно переделывать. А у тебя таких скриптов несколько.



Офлайн

#7 Авг. 20, 2014 00:12:48

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

с вами не по споришь…)))

Офлайн

#8 Авг. 20, 2014 01:31:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

Это просто мягко объясняю, что ты нарушил одно из правил при создании программ. Считай, что глобальные переменные имеют ту же природу. Привязав скрипт к внешней программе, ты сделал его зависимым от её семантики.

Если тебе нужно соединить две программы, то между ними должны передаваться простые данные (числа, строки).



Отредактировано py.user.next (Авг. 20, 2014 10:48:09)

Офлайн

#9 Авг. 20, 2014 13:22:55

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

shelve проблема с сохранением

окей, спасибо

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version