Найти - Пользователи
Полная версия: Syntax error
Начало » Python для новичков » Syntax error
1 2
poiklik
В Питоне новичек, но с недавнего времени решил заняться изучением. Вчера ради интереса решил запустить первый скрипт (скрипт не мой, взял на просторах сети), запустить получилось, все работает, скрипт качает файлы, складывает в нужную папочку… но ругается на файлы, в названии которых присутствуют скобки.
Привожу пару логов:

33655046: 0419(SPX).rar : rar
/bin/sh: 1: Syntax error: “(” unexpected
Traceback (most recent call last):
File “./shareleak.py”, line 109, in <module>
dumper.get_file(id)
File “./shareleak.py”, line 54, in get_file
os.rename('tmp.file', ‘slil_dump/’ + extension + “/” + str(id) +'__'+ filename)


33654972: Новая_папка_(19).rar : rar
/bin/sh: 1: Syntax error: “(” unexpected
Traceback (most recent call last):
File “./shareleak.py”, line 109, in <module>
dumper.get_file(id)
File “./shareleak.py”, line 54, in get_file
os.rename('tmp.file', ‘slil_dump/’ + extension + “/” + str(id) +'__'+ filename)
OSError: No such file or directory

Дальше привожу код самого скрипта:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# usage:
#  ./shareleak.py --site slil.ru --start 33611648 --end 33611600
#  ./shareleak.py --site rghost.ru --start 39606500 --end 39604000
from subprocess import Popen, PIPE
import urllib2, os
import re, argparse,locale
#Skip files by extension
music = ['mp3','wav','midi','mid', 'm3u', 'm4a','ogg','wma','flac','pls']
video = ['avi','mpg','mp4','3gp','mov','flv','dem','bsp','wmv']
image = ['jpg','png','gif','jpeg','bmp']
bin = ['exe','dll','bin','scr']
font = ['ttf','txd']
skip_extensions = music + video + image + bin + font
#allow extensions
allow_extensions = ['txt','rar','zip','7z']
class slil:
    def get_file(self,id):
        page = urllib2.urlopen("http://slil.ru/" + str(id)).read().decode('cp1251')
        address = ''
        for line in page.splitlines():
            if line.find('var l1nk=')==-1:
                continue
            parts = line.split("'")
            address = "http://slil.ru" +  parts[1] + parts[3]
            break
        if len(address) < 3:
            print str(id) + ': FILE_NOT_FOUND'
            return
        filename = address.split('/')[5]
        extension = os.path.splitext(filename)[1].replace('.','').lower()
        #if extension not in allow_extensions:
        #    return
        if extension in skip_extensions:
            return
        print(str(id) +': '+filename + ' : '+ extension)
        if not os.path.exists('slil_dump/'+extension):
            os.makedirs('slil_dump/'+extension)
        #use tmp file to fix wget bug
        args = 'wget ' + address + ' -O tmp.file'
        Popen(args, stdin=PIPE, stdout=PIPE, shell=True).communicate('')
        os.rename('tmp.file', 'slil_dump/' + extension + "/" + str(id) +'__'+ filename)
    def upload_file(self,path):
        pass
class rghost:
    def get_file(self,id):
        try:
            page = urllib2.urlopen("http://rghost.ru/" + str(id)).read()
        except :
            return
        address = ''
        for line in page.splitlines():
            if line.find('http://rghost.ru/download/')==-1:
                continue
            address = line.split('"')[1]
            break
        if len(address) < 3:
            print str(id) + ': FILE_NOT_FOUND'
            return
        filename = re.findall(r'<h1>(.*?)<small>', page, re.DOTALL)[0].split('>')[1].replace('</a','')
        extension = os.path.splitext(filename)[1].replace('.','').lower()
        #if extension not in allow_extensions:
        #    return
        if extension in skip_extensions:
            return
        print(str(id) +': '+filename + ' : '+ extension)
        if not os.path.exists('rghost_dump/'+extension):
            os.makedirs('rghost_dump/'+extension)
        #use tmp file to fix wget bug
        args = 'wget ' + address + ' -O tmp.file'
        Popen(args, stdin=PIPE, stdout=PIPE, shell=True).communicate('')
        os.rename('tmp.file', 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename)
    def upload_file(self,path):
        pass
if __name__ == "__main__":
    #locale.setlocale(locale.LC_ALL, "ru_RU.UTF-8"),
    parser = argparse.ArgumentParser(description="Small file storage dumper. Supports slil.ru, rghost.ru")
    parser.add_argument('--site', action="store",help='site target slil.ru or rghost.ru', required=True)
    parser.add_argument('--start', action="store", type=int, help='start number', required=True)
    parser.add_argument('--end', action="store", type=int, help='end number', required=True)
    args = parser.parse_args()
    if args.site == 'slil.ru':
        dumper = slil()
    else:
        dumper = rghost()
    for id in xrange(args.start,args.end,-1):
        dumper.get_file(id)

Собственно вопрос, как исправить эту ошибку и сделать, что бы скрипт нормально работал с файлами, в именах которых встречаются скобки?
fata1ex
Код не смотрел, но если проблема действительно в скобках, кто мешает обычным .replace их заменять на лошадок?
poiklik
fata1ex
Код не смотрел, но если проблема действительно в скобках, кто мешает обычным .replace их заменять на лошадок?

Я прошу прощения за наглость, но не могли бы Вы подсказать, как это сделать? К сожалению, я практически не знаю python (все что я сделал - запустил скрипт, начал сегодня читать книгу, до этого изучал c++, pascal), а скрипт должен работать уже сегодня. Если Вам не трудно, помогите.
fata1ex
Смысл такой:
>>> filename = 'asdaksdjasd_(!aha!)_ajsdfajfsa'
>>> filename.replace('(', 'loshadka').replace(')', 'loshadka')
'asdaksdjasd_loshadka!aha!loshadka_ajsdfajfsa'
EBFE
bin/sh “не любит” скобки.
os.rename('tmp.file', 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename)
=>
new_name =  'rghost_dump/' + extension + "/" + str(id) +'__'+ filename
os.rename('tmp.file', '"{escape_me}"'.format(escape_me = new_name))
poiklik
EBFE
bin/sh “не любит” скобки.
os.rename('tmp.file', 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename)
=>
new_name =  'rghost_dump/' + extension + "/" + str(id) +'__'+ filename
os.rename('tmp.file', '"{escape_me}"'.format(escape_me = new_name))

Заменил строки в коде, эффекта не принесло.
sudo python ./shareleak2.py –site rghost.ru –start 39698883 –end 39698057
39698882: Новая папка (5).part2.rar : rar
/bin/sh: 1: Syntax error: “(” unexpected
Traceback (most recent call last):
File “./shareleak2.py”, line 110, in <module>
dumper.get_file(id)
File “./shareleak2.py”, line 91, in get_file
os.rename('tmp.file', ‘“{escape_me}”’.format(escape_me = new_name))
OSError: Нет такого файла или каталога
odnochlen
А почему бы Popen не передавать список вместо строки?
Андрей Светлов

odnochlen А почему бы Popen не передавать список вместо строки?

Правильное решение.

Только тогда нужно убрать shell=True: http://asvetlov.blogspot.com/2011/03/subprocess.html

poiklik
Андрей Светлов
> *odnochlen*
А почему бы Popen не передавать список вместо строки?

Правильное решение.

Только тогда нужно убрать *shell=True*: http://asvetlov.blogspot.com/2011/03/subprocess.html

Ребята, расскажите тупому, как это все сделать? А лучше, покажите, не бум-бум я пока что в питоне, и когда разберусь не ясно, я бы и сам покопался, но скрипт в рабочем виде сильно срочно нужен:-(
Андрей Светлов

Используйте

Popen(['/usr/bin/wget', address, '-O'.  'tmp.file'], stdin=PIPE, stdout=PIPE).wait()

И перед rename сделайте

dirname = ‘slil_dump/’ + extension + “/”
if not os.path.exists(dirname):
    os.makedirs(dirname)
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