Pregunta

Actualización:. Mi pregunta actual es ¿cómo puedo obtener mi código para leer a la EOF comenzando desde el principio con cada nueva frase de búsqueda

Esta es una tarea que estoy haciendo y actualmente ha quedado atascado en. Cuenta de esto es la clase de programación de un principiante usando Python.

jargon = open("jargonFile.txt","r")
searchPhrase = raw_input("Enter the search phrase: ")
while searchPhrase != "":
    result = jargon.readline().find(searchPhrase)
    if result == -1:
        print "Cannot find this term."
    else:
        print result
    searchPhrase = raw_input("Enter the search phrase: ")
jargon.close()

La asignación es tomar searchphrase de un usuario y encontrarlo en un archivo (jargonFile.txt) y luego tener que imprimir el resultado (que es la línea que se produjo y la aparición de caracteres). Me va a utilizar un contador para encontrar el número de línea de la ocurrencia, pero voy a poner en práctica esta tarde. Por ahora mi pregunta es el error que estoy recibiendo. I cann't encontrar una manera para él para buscar el archivo completo.

Ejecutar la muestra:

Enter the search phrase: dog
16
Enter the search phrase: hack
Cannot find this term.
Enter the search phrase:

"perro" se encuentra en la primera línea sin embargo, se encuentra también en otras líneas de la jargonFile (varias veces como una cadena) pero sólo se muestra la primera aparición en la primera línea. El truco cadena se encuentra en numerosas ocasiones en la jargonFile pero mi código se configure sólo para buscar la primera línea. ¿En qué puedo ir sobre la solución de este problema?

Si esto no es lo suficientemente claro que puedo publicar la asignación si es necesario.

¿Fue útil?

Solución

Hmm, no sé nada en absoluto acerca de Python, pero me parece que no está iteración a través de todas las líneas del archivo de la cadena de búsqueda introducida.

Por lo general, tiene que hacer algo como esto:

enter search string
open file
if file has data
   start loop
     get next line of file
     search the line for your string and do something

   Exit loop if line was end of file

Así que para su código:

jargon = open("jargonFile.txt","r")
searchPhrase = raw_input("Enter the search phrase: ")
while searchPhrase != "":
    <<if file has data?>>
      <<while>>
        result = jargon.readline().find(searchPhrase)
        if result == -1:
            print "Cannot find this term."
        else:
            print result
      <<result is not end of file>>
   searchPhrase = raw_input("Enter the search phrase: ")
jargon.close()

Cool, hizo un poco de investigación en el DNS proporcionado página y Python pasa a tener el "con" la palabra clave. Ejemplo:

with open("hello.txt") as f:
    for line in f:
        print line

Así que otra forma de su código podría ser:

searchPhrase = raw_input("Enter the search phrase: ")
while searchPhrase != "":
    with open("jargonFile.txt") as f:
        for line in f:
           result = line.find(searchPhrase)
           if result == -1:
              print "Cannot find this term."
           else:
              print result
    searchPhrase = raw_input("Enter the search phrase: ")

Tenga en cuenta que "con" cierra automáticamente el archivo cuando haya terminado.

Otros consejos

En primer lugar se abre el archivo y leer en una cadena con readline (). Más adelante se tratará de readline () de la cadena que se obtuvo en el primer paso.

Es necesario tener cuidado qué objeto (cosa) que está manejando: open () que dio un archivo "jerga", readline en la jerga se dio a la cadena "jargonFile"

.

Así jargonFile.readline no tiene sentido más

Update como respuesta a comentar:

Bien, ahora que el problema se resuelve el error str pensar en la estructura del programa:

big loop
  enter a search term
  open file
  inner loop
     read a line
     print result if string found
  close file

Se necesitaría cambiar su programa de lo que se deduce que descripiton

Actualización II:

SD, si se quiere evitar la reapertura del archivo que todavía necesitaría dos bucles, pero esta vez un bucle lee el archivo en la memoria, cuando se hace eso el segundo bucle pregunta por el término de búsqueda. Por lo que sería estructurarlo como

create empty list
open file
read loop:
    read a line from the file
    append the file to the list
close file
query loop:
    ask the user for input
    for each line in the array:
        print result if string found

Para obtener puntos extra de su profesor de añadir algunos comentarios a su solución que mencionan dos posibles soluciones y decir por qué elegir la que lo hizo. Sugerencia: En este caso se trata de una disyuntiva clásica entre el tiempo de ejecución (memoria es rápido) y el uso de la memoria (lo que si el archivo de la jerga contiene 100 millones de entradas ... ok, tendrá que utilizar algo más complicado que un archivo plano en ese caso es u no se puede cargar en la memoria tampoco.)

Oh y una pista más a la segunda solución: Python soporta tuplas ( "a", "b", "c") y listas [ "a", "b", "c"]. Desea utilizar este último, ya que la lista puede ser modificada (una tupla no puede.)

myList = ["Hello", "SD"]
myList.append("How are you?")
foreach line in myList:
    print line

==>

Hello
SD
How are you?

Está bien que el último ejemplo contiene todas las cosas nuevas (lista definir, añadir a la lista, un bucle sobre la lista) por la segunda solución de su programa. Diviértete ponerlo todo junto.

Su archivo es jargon, no jargonFile (una cadena). Eso es probablemente lo que está causando su mensaje de error. Usted también necesitará un segundo bucle para leer cada línea del archivo desde el principio hasta que encuentre la palabra que está buscando. Su código se detiene buscando si la palabra no se encuentra en la línea actual del archivo.

¿Qué hay de tratar de escribir código que sólo le da al usuario una oportunidad para introducir una cadena? Entrada de esa cadena, buscar el archivo hasta que lo encuentre (o no) y la salida de resultado. Después de obtener que trabaja puede volver atrás y añadir el código que permite múltiples búsquedas y termina en una cadena vacía.

Actualización:

Para evitar la iteración de los archivos varias veces, usted podría comenzar su programa de sorber todo el archivo en una lista de cadenas, una línea a la vez. Busque el método readlines de objetos de archivo. A continuación, puede buscar esa lista para cada entrada del usuario en lugar de volver a leer el archivo.

no se debe tratar de reinventar la rueda. sólo tiene que utilizar el nuevo módulo . el programa podría funcionar mejor si se ha utilizado: resultado = jargon.read (). en lugar de: resultado = jargon.readline (). entonces se podría utilizar la función re.findall () y unirse a las cadenas (con los índices) Buscó con str.join () esto podría ser un poco desordenado pero si tomar algún tiempo para trabajar hacia fuera, esto podría arreglar el problema. la documentación de Python tiene esto perfectamente documentado

Cada vez que se introduce una frase de búsqueda, lo busca en el Siguiente la línea, no el primero. Es necesario volver a abrir el archivo para cada frase de búsqueda, si desea que se comporte como usted describe.

Tome un vistazo a la documentación de objetos File:

http://docs.python.org/library/stdtypes.html # file-objetos

Usted podría estar interesado en el método readlines. Para un caso sencillo en el que el archivo no es enorme, usted podría utilizar eso para leer todas las líneas en una lista. Entonces, cada vez que reciba una nueva cadena de búsqueda, puede ejecutar a través de toda la lista para ver si está ahí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top