2016-11-06 3 views
0

Я автоматизирую наш ежедневный материал. Вот мой код занимает абсолютный путь каталога как вход. Он читает каждый файл в каталоге, который сортируется по имени файла. а затем он объединяет содержимое каждого файла, чтобы сформировать строку. Конечная конкатенированная строка должна быть проверена. Если строка верна, она будет давать true else false, если это недопустимое выражение. Я думаю, что действительное выражение: "(a + b) * c + (d/e) ', I Недопустимое выражение:" (a + b " .автоматизация ручного вещания

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

from math import * 
import os 
import glob 

Path = os.path.abspath("mydir/myfile.txt") 
files = glob.glob(Path) 
for name in files: 
    try: 
     with open(name) as f: 
      s+=f.read() 
      sys.stdout.write(s) 
    except IOError as exec: 
     if exc.errno != errno.EISDIR: 
      raise 

def validateSyntax(a): 
    functions = {'__builtins__': None} 
    variables = {'__builtins__': None} 
    functions = {'acos': acos, 
     'asin': asin, 
     'atan': atan, 
     'atan2': atan2, 
     'ceil': ceil, 
     'cos': cos, 
     'cosh': cosh, 
     'degrees': degrees, 
     'exp': exp, 
     'fabs':fabs, 
     'floor': floor, 
     'fmod': fmod, 
     'frexp': frexp, 
     'hypot': hypot, 
     'ldexp': ldexp, 
     'log': log, 
     'log10': log10, 
     'modf': modf, 
     'pow': pow, 
     'radians': radians, 
     'sin': sin, 
     'sinh': sinh, 
     'sqrt': sqrt, 
     'tan': tan, 
     'tanh': tanh} 

    variables = {'e': e, 'pi': pi} 

    try: 
     eval(s,variables, functions) 
    except (SyntaxError, NameError, ZeroDivisionError): 
     return False 
    else: 
     pass 
+0

Исправьте отступ в коде – inspectorG4dget

+0

В чем вопрос? – UnholySheep

+0

Проблема заключается в том, что конкатенация содержимого каждого файла для формирования конечной конкатенированной строки строки должна быть проверена. Для проверки проверки строки я написал собственный интерпретатор, в котором выражение получает подтверждение. Но это не работает. –

ответ

1

OK Я буду удалять, если это получает какой-либо понижающий голос, но я действительно думаю, что это реальный ответ на предлагаемый вопрос .

Во-первых, добро пожаловать в СОСТОЯНИЕ и не ставьте кого-либо, кто может вас расстроить. Мы все хотим помочь, и мы знаем, что вы учитесь. r, вам нужно отвечать взаимностью, и это делается путем аккуратного, методичного и аккуратного изложения вашего вопроса, и таким образом, чтобы показать, что вы потратили на него незначительное количество времени. Это означает, в том числе:

  • Четкое описание вашего входа и требуемого выходного
  • Любая спецификация, которая поможет нам минимизировать количество времени, потраченное на угадывание
  • примеры кода, что вы пытались (что на самом деле запустить)
  • Причины (доказательство, т.е. stacktraces) относительно того, почему они не работают
  • Что вы думаете, следующие шаги

Я, вероятно, читаю приветственную страницу SO или что-то в этом роде ... В любом случае, я привел ваш код для вас и сделал быстрый поиск Google, чтобы дать вам несколько идей.

Во-первых, НЕ используйте exec для решения этой проблемы. Не потому, что это «опасно», а потому, что это не нужно. Это будет намного медленнее. Давайте придерживаться обработки символов.

После 90 второго поиска Google (математическое выражение «валидатор» питон), я хотел бы использовать http://codegists.com/snippet/python/math-expression-syntax-validator-of-parentheses-in-python-3

Для чего-то более сложного, это хорошо выглядит http://effbot.org/zone/simple-top-down-parsing.htm

Теперь, когда вы идете оттуда, вам необходимо будет предоставить спецификацию. Надежда По крайней мере, это помогает :)

+0

Я ценю вашу быструю помощь. Выражение в codegists.com отличается от вышеуказанной проблемы. –

+0

Глядя еще раз на ваш вопрос, что именно представляет собой файл примера, который вы бы конкатенируете? Является ли валидатор математических выражений фактически тем, что вам нужно? Посмотрите --- вековая игра SO quintillion вопросов: D – Eugene

+0

О, извини ... Ну, вы также можете посмотреть на полномасштабных оценщиков, таких как pyparsing или symfony, или написать сами (в основном, парсер LR) , Я бы сделал это для вас, если бы знал, что вам нужно ... – Eugene

Смежные вопросы