2014-01-08 4 views
0

Я пытаюсь создать скрипт для чтения моего файла route.php и получить данные.Python 3 прочитать файл по частям

Например, у меня есть route.php с ff. данные:

/** 
* @param string username required 
* @param string password required 
* @param string first_name required 
* @param string last_name required 
* @param string email  required 
*/ 
Route::POST('/register', '[email protected]'); 

/** 
* @param string username required 
* @param string password required 
* @param string first_name required 
* @param string last_name required 
* @param string email  required 
*/ 
Route::POST('/login', '[email protected]'); 

Допустим, что оба они разные.

Теперь я хочу, чтобы каждый из маршрутов, начиная с /** в );

В примере он возвращает 2 маршрута, мне просто нужно, чтобы получить маршрут URL-адрес, метод и параметры с помощью функции я уже есть.

Проблема только в том, как читать файл за маршрут?

# read troutes.php 
routes = open('troutes.php', 'r') 

# do stuff to each routes 
print(routes.read()) 

# close troutes.php 
routes.close() 

обновление

Я попытался чтения файла построчно, но проблема заключается в том, чтобы получить комментарий выше маршрут и связать его с маршрутом.

for line in open('routes.php'): 
    li = line.strip() 
    if li.startswith('Route::'): 

    # print method 
    method = find_between(li, "Route::", "(") 

обновление

питон должен вернуть 2 маршрута, как это:

Method: POST 
Url: /register 
Parameter: 
    username 
     type: string 
     required: True 
    password 
     type: string 
     required: True 

Method: POST 
Url: /login 
......so on per route 
+5

PHP и Python. NO –

+3

Нет, я не работаю с обоими. Я просто создаю скрипт для анализа данных из php-файла. Хорошо, просто проигнорируйте, какой файл я разбираю. – majidarif

ответ

0

Это поможет вам начать:

#!/usr/bin/env python3 

import re 

routes = [] 
with open('routes.php', 'r') as f: 
    current_comment = '' 
    in_comment = False 
    for line in f: 
     line = line.lstrip() 
     if line.startswith('/**'): 
      in_comment = True 

     if in_comment: 
      current_comment += line 

     if line.startswith('*/'): 
      in_comment = False 

     if line.startswith('Route::'): 
      matches = re.search(r"Route::([A-Z]+)\('(.*)', '(.*)'\);", line) 
      groups = matches.groups() 
      routes.append({ 
       'comment': current_comment, 
       'method': groups[0], 
       'path': groups[1], 
       'handler': groups[2], 
      }); 
      current_comment = '' # reset the comment 

print(routes) 

Выход:

[ 
    { 
     'comment': '/**\n* @param string username required \n* @param string password required\n* @param string first_name required\n* @param string last_name required\n* @param string email  required\n*/\n', 
     'path': '/register', 
     'handler': '[email protected]', 
     'method': 'POST' 
    }, 
    { 
     'comment': '/**\n* @param string username required \n* @param string password required\n* @param string first_name required\n* @param string last_name required\n* @param string email  required\n*/\n', 
     'path': '/login', 
     'handler': '[email protected]', 
     'method': 'POST' 
    } 
] 

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

+0

Я также в настоящее время пытаюсь это сделать.Но 'cmd' для окон очень забивается при запуске скрипта. позвольте мне найти способ лучше увидеть, возвращается – majidarif

1

Возможно, как это, чтобы вы начали:

#!/usr/bin/env python 

with open("input") as fd: 
    data = [i.strip() for i in fd] 

D = [] 
tmp = [] 
for i in data: 
    tmp.append(i) 
    if ';' in i: 
     D.append(tmp) 
     tmp = [] 

print D[0][-1] 
print D[1][-1] 

Выход :

Route::POST('/register', '[email protected]'); 
Route::POST('/login', '[email protected]'); 
+0

Но я также хочу связать маршрут с его комментарием. Потому что я также проанализирую параметры маршрута из комментария. Я уже пробовал это с 'if line.startswith ('Route ::'):' Но это не то, что я хотел. – majidarif

+0

'D [n]' содержит полный маршрут, '[-1]' просто отображает последнюю запись в списке, которая является частью «Маршрут ::». –

+0

Я вижу, я пробовал, но первый список включает ' majidarif

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