Я пытаюсь создать сценарий Python2.6 для Win32, который будет читать все текстовые файлы, хранящиеся в каталоге, и печатать только строки, содержащие фактические данные. Пример файла -
Set : 1
Date: 10212009
12 34 56
25 67 90
End Set
+++++++++
Set: 2
Date: 10222009
34 56 89
25 67 89
End Set
В приведенном выше примере файла я хочу напечатать только строки 3, 4 и 9, 10 (фактические значения данных). Программа делает это итеративно на всех текстовых файлах.
Я написал сценарий, как показано ниже, и тестирую его на одном текстовом файле по ходу работы
Моя логика - читать входные файлы один за другим и искать начальную строку. Как только совпадение будет найдено, начните поиск конечной строки. когда оба найдены, выведите строки от начальной строки до конечной строки. Повторите процедуру для остальной части файла перед открытием другого файла.
Проблема, с которой я столкнулся, заключается в том, что он успешно читает набор данных 1, но затем запирает последующие наборы в файле. Для набора 2 это идентифицирует нет. строк для чтения, но печатает их, начиная с неправильного номера строки.
Небольшое копание приводит к следующим объяснениям -
1. Используйте поиск и подсказку, чтобы изменить положение второй итерации цикла, которая не сработала, поскольку файл читается из буфера, и это приводит к ошибке «сказать».
2. Открытие файла в бинарном режиме кому-то помогло, но у меня это не работает.
3. Откройте файл с режимом буфера 0, но он не работает.
Вторая проблема, с которой я сталкиваюсь, заключается в том, что при печати данных из набора 1 вставляется пустая строка между двумя строками значений данных. Как от этого избавиться?
Примечание. Игнорировать все ссылки на next_run в приведенном ниже коде. Я пробовал это для изменения положения строки. Последующие поиски начальной строки должны начинаться с последней позиции конечной строки
#!C:/Python26 python
# Import necessary modules
import os, glob, string, sys, fileinput, linecache
from goto import goto, label
# Set working path
path = 'C:\\System_Data'
# --------------------
# PARSE DATA MODULE
# --------------------
# Define the search strings for data
start_search = "Set :"
end_search ="End Set"
# For Loop to read the input txt files one by one
for inputfile in glob.glob( os.path.join( path, '*.txt' ) ):
inputfile_fileHandle = open ( inputfile, 'rb', 0 )
print( "Current file being read: " +inputfile )
# start_line initializes to first line
start_line = 0
# After first set of data is extracted, next_run will store the position to read the rest of the file
# next_run = 0
# start reading the input files, one line by one line
for line in inputfile:
line = inputfile_fileHandle.readline()
start_line += 1
# next_run+=1
# If a line matched with the start_search string
has_match = line.find( start_search )
if has_match >= 0:
print ( "Start String found at line number: %d" %( start_line ) )
# Store the location where the search will be restarted
# next_run = inputfile_fileHandle.tell() #inputfile_fileHandle.lineno()
print ("Current Position: %d" % next_run)
end_line = start_line
print ( "Start_Line: %d" %start_line )
print ( "End_Line: %d" %end_line )
#print(line)
for line in inputfile:
line = inputfile_fileHandle.readline()
#print (line)
end_line += 1
has_match = line.find(end_search)
if has_match >= 0:
print 'End String found at line number: %d' % (end_line)
# total lines to print:
k=0
# for loop to print all the lines from start string to end string
for j in range(0,end_line-start_line-1):
print linecache.getline(inputfile, start_line +1+ j )
k+=1
print ( "Number of lines Printed: %d " %k )
# Using goto to get out of 2 loops at once
goto .re_search_start_string
label .re_search_start_string
#inputfile_fileHandle.seek(next_run,0)
inputfile_fileHandle.close ()