Открыть файл в массив, поиск строки и возвращаемое значение - PullRequest
3 голосов
/ 09 октября 2010

Хорошо, я работал над этим некоторое время и не могу его получить.

Я делаю метод, который принимает имя файла и шаблон.

Например, findPattern (fname, pat)

Тогда цель состоит в том, чтобы найти этот шаблон, скажем, строку «яблоко» в открывшемся текстовом файле, и вернуть его местоположение по [строка, индекс начала символа] Я новичокна python и было сказано множество способов, но они либо слишком сложны, либо нам не разрешено использовать их, например, index;мы специально должны использовать массивы.

Мои мысли были двумя вложенными для циклов, внешняя сторона проходит через каждый индекс массива текстовых файлов, а внутренняя для цикла сравнивает первую букву нужного шаблона.Если он найден, внутренний цикл будет инерционирован, поэтому теперь он проверяет p в apple против текстового файла.

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

Вот что у меня есть, хотя не совсем работает.Я просто экспериментировал с .tell, чтобы показать мне, где он, но он всегда в 141, который я считаю EOF, но я не проверял.

#.....Id #
#.....Name

#########################
#my intent was for you to write HW3 code as iteration or
#nested iterations that explicitly index the character 
#string as an array; i.e, the Python index() also known as 
#string.index() function is not allowed for this homework.
########################

print
fname = raw_input('Enter filename: ')
pattern = raw_input('Enter pattern: ')

def findPattern(fname, pat):

    f = open(fname, "r")
    for line in f:
        if pat in line:
            print "Found it @ " +(str( f.tell()))
            break
    else:
        print "No esta..."    

print findPattern(fname, pattern)

РЕДАКТИРОВАТЬ:

fname = raw_input('Enter filename: ')
pattern = raw_input('Enter pattern: ')

def findPattern(fname, pat):

    arr = array.array('c', open(fname, 'rb').read())

    for i in xrange(len(arr)):
        if ''.join(arr[i:i+len(pat)]) == pat:
            print 'Found @ %d' % i    

print

findPattern(fname, pattern)

Итак, из нового кода, замененного выше, я получаю то, что ниже.Я знаю, что это что-то глупое, как массив, который не был объявлен, но я не совсем уверен, синтаксис Python для этого, разве массив не должен иметь установленный размер, когда вы объявляете его?

lynx:desktop $ python hw3.py

Enter filename: declaration.txt
Enter pattern: become

Traceback (most recent call last):
  File "hw3.py", line 25, in <module>
    findPattern(fname, pattern)
  File "hw3.py", line 17, in findPattern
    arr = array.array('c', open(fname, 'rb').read())
NameError: global name 'array' is not defined

РЕДАКТИРОВАТЬИ закончено!Спасибо, парни.Вот как я это определил ..

#Iterate through
for i in xrange(len(arr)):

    #Check for endline to increment linePos
    if arr[i] == '\n':
        linePos = linePos + 1
        colPos = i

    #Compare a chunk of array the same size
    #as pat with pat itself
    if ''.join(arr[i:i+len(pat)]) == pat:

        #Account for newline with absolute position
        resultPos = i - colPos
        print 'Found @ %d on line %d' % (resultPos, linePos)

1 Ответ

1 голос
/ 09 октября 2010

Единственный способ получить текстовые данные в массив - это символы:

a = array.array('c', open(filename, 'rb').read())

Оттуда вы можете просто перебрать его и преобразовать каждый подмассив той же длины, что и ваша подстрока, в строку для сравнения:

for i in xrange(len(a)):
   if ''.join(a[i:i+len(substring)]) == substring:
      print 'Found @ %d!' % i

Это, однако, глубоко непитонический и мучительно медленный .

Если под массивом вы подразумеваете список (эти два термина имеют очень разные значения в Python):

pos = 0
for line in open(filename):
    for i in xrange(len(line)):
        if line[i:i+len(substring)] == substring:
           print 'Found @ %d!' % (pos + i)
    pos += len(line) + 2 # 1 if on Linux

Это также медленно и непитонично, но значительно меньше, чем в предыдущем варианте. Если что-то из того, о чем вас просили, вероятно, не должно преподавать Python. : Р

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...