2014-09-24 2 views
0

Я новичок в программировании на питоне. Я работаю над текстовым файлом, который был результатом файла программного обеспечения. В основном, когда мы работаем над этим программным обеспечением, пишем все сообщения в текстовый файл результата (аналогично файлу журнала).поиск последней измененной таблицы в .txt-файле

Теперь моя проблема заключается в том, что файл имеет множество таблиц, как показано ниже:

it may have some million lines above 
* ============================== INERTIA ============================== 
* File: /home/hamanda/transfer/cradle_vs30_dkaplus01_fwd_dl140606_fem140704_v00.bif 
* Solver: Nastran 
* Date: 24/09/14 
* Time: 10:29:50 
* Text: 
* 
* Area        +1.517220e+06 
* Volume        +5.852672e+06 
* 
* Structural mass     +4.594348e-02 
* MASS elements      +0.000000e+00 
* NSM on property entry    +0.000000e+00 
* NSM by parts (VMAGen and MPBalanc) +0.000000e+00 
* NSM by NSMCreate     +0.000000e+00 
* Total mass       +4.594348e-02 
* 
* Center of gravity 
* in the global   +1.538605e+02 +3.010898e+00 -2.524868e+02 
* coordinate system 
* 
* Moments of inertia +8.346990e+03 +6.187810e-01 +1.653922e+03 
* about the global  +6.187810e-01 +5.476398e+03 +4.176218e+01 
* coordinate system  +1.653922e+03 +4.176218e+01 +7.746156e+03 
* 
* Steiner share   +2.929294e+03 +4.016500e+03 +1.088039e+03 
* 
* Moments of inertia +5.417696e+03 +2.190247e+01 -1.308790e+02 
* about the center  +2.190247e+01 +1.459898e+03 +6.835397e+00 
* of gravity   -1.308790e+02 +6.835397e+00 +6.658117e+03 
* --------------------------------------------------------------------- 
some lines below and this table may repeat if user does any change to area and volume 
values.---------- 

Теперь мой вопрос, как я могу напечатать последнюю таблицу на консоли. я могу напечатать первое появление таблицы, и теперь я не могу получить последнее появление таблицы.

Мне нужна последняя таблица для печати на консоли, как я могу это сделать? Это мой код:

input = open(fileName,'r') 
    intable = False 
    for line in input: 
     if line.strip() == "* ============================== INERTIA ==============================": 
      intable = True 
     if line.strip() == "* ---------------------------------------------------------------------": 
      intable = False 
      break 
     if intable and line.strip().startswith("*"): 
      z1=(line.strip()) 
      print(z1) 
+0

У вас есть хороший старт, но это не ясно, что вы застряли на. Разберите даты и сравните их с новейшими. Если это новее, держите его. В конце файла напечатайте тот, который вы сохранили. С какой частью у вас проблемы? – tripleee

+0

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

+0

Я могу это сделать, но иногда он не может писать дату и время, потому что, когда программное обеспечение работает вживую, и вы делаете некоторые изменения в области и томе, он просто пишет свежую таблицу, но может не писать дату и время, которые она только создает новую таблицу. у меня возникают проблемы с этим, потому что я не могу их разметить. @ tripleee – ayaan

ответ

1

Попробуйте это:

f = open(fileName,'r') 
content = f.readlines() 
content.reverse() 
for line in content: 
    if line.strip() == "* ============================== INERTIA ==============================": 
     index = content.index(line) 
     break 
for line in content[index::-1]: 
    print line 
+0

да, я вернусь к вам ... – ayaan

+0

Я отредактировал код, и благодаря вам он работает сейчас – ayaan

0

Вы также можете захватить ваши данные файла в списке, как показано ниже:

delimiter = '* ============================== INERTIA ==============================\n' 
    filedata = open(filepath).read().split(delimiter) 
    print filedata[-1] # This will print your latest occurrence of table 

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

+0

Это такой быстрый подход, но неэффективен. если файл результатов слишком велик, то это занимает слишком много времени. – han058

+0

Да, файл результата имеет приблизительно 1212567 строк, он занимает так много времени ....... – ayaan

+0

..., @ayaan, тогда я рекомендую использовать bash. Или лучший способ python - немного сложнее. – han058

1

Если вы можете использовать bash, то ниже более эффективный способ.

RESULT_FILE="result_text_file_name" 
START_LINE=$(grep -n "===== INERTIA ====" $RESULT_FILE | tail -1 | cut -d":" -f1) 
END_LINE=$(grep -n " --------------" $RESULT_FILE | tail -1 | cut -d":" -f1) 
LINE_COUNT=$(wc -l $RESULT_FILE | awk '{print $1}') 
tail -n `expr $LINE_COUNT - $FIRST_LINE + 1` $RESULT_FILE | head -n `expr $END_LINE - $FIRST_LINE + 1` 

еще вы хотите питона, а затем прочитать пост How to read lines from a file in python starting from the end

и я написал код, ссылается на страницу выше! (Читать строки в обратном направлении)

Я предположил, что файл Результат является «test.txt»

#!/usr/bin/env python 
import sys 
import os 
import string 

"""read a file returning the lines in reverse order for each call of readline() 
This actually just reads blocks (4096 bytes by default) of data from the end of 
the file and returns last line in an internal buffer. I believe all the corner 
cases are handled, but never can be sure...""" 

class BackwardsReader: 
    def readline(self): 
    while len(self.data) == 1 and ((self.blkcount * self.blksize) < self.size): 
     self.blkcount = self.blkcount + 1 
     line = self.data[0] 
     try: 
     self.f.seek(-self.blksize * self.blkcount, 2) # read from end of file 
     self.data = string.split(self.f.read(self.blksize) + line, '\n') 
     except IOError: # can't seek before the beginning of the file 
     self.f.seek(0) 
     self.data = string.split(self.f.read(self.size - (self.blksize * (self.blkcount-1))) + line, '\n') 

    if len(self.data) == 0: 
     return "" 

    # self.data.pop() 
    # make it compatible with python <= 1.5.1 
    line = self.data[-1] 
    self.data = self.data[:-1] 
    return line + '\n' 

    def __init__(self, file, blksize=4096): 
    """initialize the internal structures""" 
    # get the file size 
    self.size = os.stat(file)[6] 
    # how big of a block to read from the file... 
    self.blksize = blksize 
    # how many blocks we've read 
    self.blkcount = 1 
    self.f = open(file, 'rb') 
    # if the file is smaller than the blocksize, read a block, 
    # otherwise, read the whole thing... 
    if self.size > self.blksize: 
     self.f.seek(-self.blksize * self.blkcount, 2) # read from end of file 
    self.data = string.split(self.f.read(self.blksize), '\n') 
    # strip the last item if it's empty... a byproduct of the last line having 
    # a newline at the end of it 
    if not self.data[-1]: 
     # self.data.pop() 
     self.data = self.data[:-1] 


if(__name__ == "__main__"): 
    f = BackwardsReader("test.txt") 
    end_line = "---------------------------------------------------" 
    start_line = "========= INERTIA =======" 
    lines = [] 

    intable = False 
    line = f.readline() 
    while line: 
    if line.find(end_line) >= 0: 
     intable = True 
    if intable: 
     lines.append(line) 
     if line.find(start_line) >= 0: 
     break 
    line = f.readline() 

    lines.reverse() 

    print "".join(lines) 

и результат теста!

[my server....]$ wc -l test.txt 
 
34008720 test.txt 
 

 
[my server....]$ time python test.py 
 
* ============================== INERTIA ============================== 
 
* File: /home/hamanda/transfer/cradle_vs30_dkaplus01_fwd_dl140606_fem140704_v00.bif 
 
* Solver: Nastran 
 
* Date: 24/09/14 
 
* Time: 10:29:50 
 
* Text: 
 
* 
 
* Area        +1.517220e+06 
 
* Volume        +5.852672e+06 
 
* 
 
* Structural mass     +4.594348e-02 
 
* MASS elements      +0.000000e+00 
 
* NSM on property entry    +0.000000e+00 
 
* NSM by parts (VMAGen and MPBalanc) +0.000000e+00 
 
* NSM by NSMCreate     +0.000000e+00 
 
* Total mass       +4.594348e-02 
 
* 
 
* Center of gravity 
 
* in the global   +1.538605e+02 +3.010898e+00 -2.524868e+02 
 
* coordinate system 
 
* 
 
* Moments of inertia +8.346990e+03 +6.187810e-01 +1.653922e+03 
 
* about the global  +6.187810e-01 +5.476398e+03 +4.176218e+01 
 
* coordinate system  +1.653922e+03 +4.176218e+01 +7.746156e+03 
 
* 
 
* Steiner share   +2.929294e+03 +4.016500e+03 +1.088039e+03 
 
* 
 
* Moments of inertia +5.417696e+03 +2.190247e+01 -1.308790e+02 
 
* about the center  +2.190247e+01 +1.459898e+03 +6.835397e+00 
 
* of gravity   -1.308790e+02 +6.835397e+00 +6.658117e+03 
 
* --------------------------------------------------------------------- 
 

 

 
real \t 0m0.025s 
 
user \t 0m0.018s 
 
sys \t 0m0.006

+0

test.txt в последней строке должен быть зафиксирован на «$ RESULT_FILE» – han058

+1

Ern, почему бы не просто 'awk '/ INERTIA/{i = 1; delete a} {a [i ++] = $ 0} END {for (j = i; j <= i; ++ j} напечатать a [j]} '"$ RESULT_FILE" ' – tripleee

+0

Я знал этот путь, но я нехорошо использовать awk! так что я написал не-элегантный способ! – han058

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