Найти - Пользователи
Полная версия: shelve проблема с сохранением
Начало » Python для новичков » shelve проблема с сохранением
1
simple_user
написал я прогу чтоб скачивала с 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
помогите
py.user.next
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
simple_user
благодарочка
жаль что уже реализовал по другому алгоритму ( проверяю есть ли файл в папке, если нету качаю )
py.user.next
simple_user
проверяю есть ли файл в папке

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

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

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

Сегодня она добавляет, завтра ты её обновил, она перестала добавлять. Ты об этом не узнал, скрипт работает наполовину. Потом ты узнал, скрипт нужно переделывать. А у тебя таких скриптов несколько.
simple_user
с вами не по споришь…)))
py.user.next
Это просто мягко объясняю, что ты нарушил одно из правил при создании программ. Считай, что глобальные переменные имеют ту же природу. Привязав скрипт к внешней программе, ты сделал его зависимым от её семантики.

Если тебе нужно соединить две программы, то между ними должны передаваться простые данные (числа, строки).
simple_user
окей, спасибо
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