2010-10-08 4 views
3

Très bien, j'ai travaillé dessus pendant un moment et je ne peux pas l'obtenir.Ouvrir le fichier dans le tableau, rechercher la chaîne et renvoyer la valeur

Je fais une méthode qui accepte un nom de fichier, et un modèle.

Par exemple findPattern (FNAME, pat)

Ensuite, l'objectif est de chercher ce modèle, par exemple la chaîne « pomme » dans le fichier texte qui est ouvert, et le retour de son emplacement par [ligne, commençant index de caractère ] Je suis novice en python et on m'a dit de nombreuses façons, mais elles sont soit trop compliquées, soit nous ne sommes pas autorisés à les utiliser comme index; nous sommes spécifiquement supposés utiliser des tableaux. Mes pensées étaient deux imbriquées pour des boucles, l'extérieur passe par chaque index du tableau de texte, et la boucle interne compare la première lettre du motif désiré. Si elle est trouvée, la boucle interne va s'incrémenter alors maintenant elle vérifie le p dans apple par rapport au fichier texte.

Un problème majeur est que je ne peux pas obtenir le fichier dans un tableau, j'ai seulement été capable de faire une ligne entière.

Voici quelque chose que j'ai, mais ne fonctionne pas tout à fait. J'expérimentais juste avec .tell pour me montrer où il est mais c'est toujours à 141, ce que je crois être l'EOF mais je n'ai pas vérifié.

#.....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) 

EDIT:

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) 

donc du nouveau code remplacé ci-dessus, je reçois ce qui est ci-dessous. Je sais que c'est quelque chose d'idiot comme le tableau qui n'est pas déclaré mais je ne suis pas vraiment sûr de la syntaxe python pour cela, est-ce qu'un tableau n'a pas besoin d'avoir une taille définie quand vous le déclarez?

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 

EDIT: Et, terminé! Merci les gars. Voilà comment je finagled il ..

#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) 
+0

ce que vous avez là ne sera probablement pas autorisé non plus car l'opérateur 'in' est une sorte de triche. Il semble que votre enseignant vous demande d'implémenter manuellement une recherche de sous-chaîne. – aaronasterling

+0

Pour lire le fichier dans une liste (* not * tableau) dans Python 2.x, utilisez 'f.readlines()'. –

Répondre

1

La seule façon d'obtenir des données de texte dans un tableau est comme caractères:

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

À partir de là, vous pouvez simplement itérer dessus et convertir chaque sous-réseau avec la même longueur que votre sous-chaîne à une chaîne à comparer:

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

Ceci est cependant profondément non pythonique et douloureusement lent.

Si par tableau vous dire une liste (les deux termes ont très différentes significations en 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 

Ceci est aussi lent et non pythonique, mais vaguement moins que l'option précédente. Si l'un de ceux-ci est vraiment ce que vous avez été demandé de faire, votre professeur ne devrait probablement pas enseigner Python. : p

+0

Ai-je besoin de déclarer un tableau en quelque sorte? –

+0

Vous devez l'importer, en fait. C'est un module. :) – Vlad

+0

Donc, similaire à #import dans c? Juste «importer tableau» semble-t-il? –

Questions connexes