2016-01-25 3 views
-3

Я читаю папку с определенным именем файла. Я читаю содержимое внутри файла, но как я могу прочитать определенные строки или последние 6 строк в файле?Как читать последние несколько строк в файле с помощью Python?

************************************ 
    Test Scenario No. 1 
    TestcaseID = FB_71125_1 
    dpSettingScript = FB_71125_1_DP.txt 
************************************ 

Setting Pre-Conditions (DP values, Sqlite DB): 

    cp /fs/images/nfs/FileRecogTest/MNT/test/Databases/FB_71125_1_device.sqlite $NUANCE_DB_DIR/device.sqlite 
    "sync" twice. 

Starting the test: 

      0#00041511#0000000000# FILERECOGNITIONTEST: = testScenarioNo (int)1 = 
      0#00041514#0000000000# FILERECOGNITIONTEST: = TestcaseID (char*)FB_71125_1 = 
      0#00041518#0000000000# FILERECOGNITIONTEST: = dpSettingScript (char*)FB_71125_1_DP.txt = 
      0#00041520#0000000000# FILERECOGNITIONTEST: = UtteranceNo (char*)1 = 
      0#00041524#0000000000# FILERECOGNITIONTEST: = expectedEventData (char*)0||none|0||none = 
      0#00041528#0000000000# FILERECOGNITIONTEST: = expectedFollowUpDialog (char*) = 
      0#00041536#0000000000# FILERECOGNITIONTEST: /fs/images/nfs/FileRecogTest/MNT/test/main_menu.wav#MEDIA_COND:PAS_MEDIA&MEDIA_NOT_BT#>main_menu.global<#<FS0000_Pos_Rec_Tone><FS1000_MainMenu_ini1> 
      0#00041789#0000000000# FILERECOGNITIONTEST: Preparing test data done 
      0#00043768#0000000000# FILERECOGNITIONTEST: /fs/images/nfs/FileRecogTest/MNT/test/Framework.wav##>{any_device_name}<#<FS0000_Pos_Rec_Tone><FS1400_DeviceDisambig_<slot>_ini1> 
      0#00044008#0000000000# FILERECOGNITIONTEST: Preparing test data done 
      0#00045426#0000000000# FILERECOGNITIONTESTWARNING: expected >{any_device_name}<, got >[email protected]_MainMenu< 
     1900#00046452#0000000000# FILERECOGNITIONTESTERROR: expected <FS0000_Pos_Rec_Tone><FS1400_DeviceDisambig_<slot>_ini1>, got <FS0000_Misrec_Tone><FS1000_MainMenu_nm1_004><pause300><FS1000_MainMenu_nm_001> 
      0#00046480#0000000000# FILERECOGNITIONTEST: Preparing test data done 
      0#00047026#0000000000# FILERECOGNITIONTEST: Stopping dialog immediately 

    [VCALogParser] Scenario 1 FAILED. 

Может кто-нибудь предложить мне, как читать определенные строки или последние 6 строк в файле?

+1

Вы используете как 'питона 2.7' и' питона 3.x' ?? !! – Arman

+2

Вы можете отредактировать свой пост. Используйте только теги _relevant_. Вы на самом деле используете 'iPython'? Какая версия Python? Не включайте все теги, в которых есть слово «python». – Arc676

+0

Я использую python 2.7.3 – ram

ответ

1

Чтобы прочитать последние 6 строк одного файла, вы можете использовать Python file.seek для перемещения рядом с концом файла, а затем прочитать оставшиеся строки. Вам нужно решить, какая максимальная длина линии может быть, например. 1024 символа.

Команда seek сначала используется для перемещения в конец файла (без ее считывания), tell используется для определения с позицией в файле (так как мы в конце, это будет длина). Затем он идет назад в файл и читает строку. Если файл очень короткий, весь файл читается.

import os 

filename = r"C:\Users\hemanth_venkatappa\Desktop\TEST\Language\test.txt" 
back_up = 6 * 1024  # Go back from the end more than 6 lines worth. 

with open(filename, "r") as f_input: 
    f_input.seek(0, os.SEEK_END) 
    backup = min(back_up, f_input.tell()) 
    f_input.seek(-backup, os.SEEK_END) 
    print f_input.readlines()[-6:] 

Использование with обеспечит ваш файл автоматически закрываются после этого. Префикс пути к файлу с r позволяет избежать двойного обратного следа вашего пути к файлу.

Так затем применить это к вашей директории ходить и писать свои результаты в отдельный выходной файл, вы можете сделать следующее:

import os 
import re 

back_up = 6 * 256  # Go back from the end more than 6 lines worth 

directory = r"C:\Users\hemanth_venkatappa\Desktop\TEST\Language" 
output_filename = r"C:\Users\hemanth_venkatappa\Desktop\TEST\output.txt" 

with open(output_filename, 'w') as f_output: 
    for dirpath, dirnames, filenames in os.walk(directory): 
     for filename in filenames: 
      if filename.startswith('VCALogParser_output'): 
       cur_file = os.path.join(dirpath, filename) 
       with open(cur_file, "r") as f_input: 
        f_input.seek(0, os.SEEK_END) 
        backup = min(back_up , f_input.tell()) 
        f_input.seek(-backup, os.SEEK_END) 
        last_lines = ''.join(f_input.readlines()[-6:]) 
        try: 
         summary = ', '.join(re.search(r'(\d+ warning\(s\)).*?(\d+ error\(s\)).*?(\d+ scenarios\(s\))', last_lines, re.S).groups()) 
        except AttributeError: 
         summary = "No summary" 
        f_output.write('{}: {}\n'.format(filename, summary)) 
+0

Я получаю сообщение об ошибке: IOError: [Errno 13] Permission denied: 'C: \\ Users \\ hemanth_venkatappa \\ Desktop \\ TEST \\ Lang' – ram

+0

снова та же ошибка: с open (имя файла, "r") как f_input: IOError: [Errno 13] Permission denied: 'C: \\ Users \\ hemanth_venkatappa \\ Desktop \\ TEST' – ram

+0

Я добавил версию, которая должна работать с вашей папкой. –

2

Я могу придумать два метода. Если ваши файлы не слишком большие, вы можете просто прочитать все строки, и держать только за последние шесть из них:

f = open(some_path) 
last_lines = f.readlines()[-6:] 

Но это на самом деле перебор. Что-то поумнее, чтобы сделать предположение, используя seek() метод вашего объекта файла:

file_size = os.stat(some_path).st_size # in _bytes_, so take care depending on encoding 
f = open(some_path) 
f.seek(file_size - 1000) # here's the guess. Adjust with expected line length 
last_lines = f.readline()[-6:] 
+0

file_size = os.stat ("C: \\ Users \\ hemanth_venkatappa \\ Desktop \\ TEST \\ Язык"). St_size f = open ("C: \\ Users \\ Desktop \\ TEST \\ Язык ") f.seek (file_size - 1000) # вот догадка. Настроить с ожидаемой длиной линии last_lines = f.readline() [- 6:] f.close() // это правильно? – ram

+0

вполне, но вы хотите использовать одно и то же имя файла для получения размера и содержимого! –

0

Или, по существу, использовать цикл для добавления строк в массив, а затем удалить п-е число элементов из массива, как :

array=[] f=open("file.txt","r") for lines in f:

array.append(f.readlines()) 

f.close() while len(array) > 5:

del array[0] 
+0

Я не буду знать количество стартовых линий, чтобы удалить его. есть ли возможное решение? – ram

+0

Что, черт возьми, это ?! Удалите эту чушь сразу! –

+0

@L_Pav: ваше намерение хорошее, но ни 'array.append (f.readlines())', ни 'del array [0]' делают то, что вы ожидаете. Перед публикацией проверьте его самостоятельно. –