Pergunta

Update:. A minha pergunta atual é como eu posso conseguir o meu código para ler a EOF começando desde o início com cada nova frase de pesquisa

Esta é uma tarefa que eu estou fazendo e atualmente preso por diante. Mente esse é aula de programação de um novato 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()

A atribuição é tomar searchphrase de um usuário e encontrá-lo em um arquivo (jargonFile.txt) e depois tê-lo imprimir o resultado (que é a linha que ocorreu e a ocorrência de caracteres). Eu vou estar usando um contador para encontrar o número da linha da ocorrência, mas vou implementar isso mais tarde. Por agora a minha pergunta é o erro que eu estou recebendo. Eu cann't encontrar uma maneira para que possa procurar o arquivo inteiro.

run Amostra:

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

"cão" é encontrada na primeira linha no entanto, também é encontrada em outras linhas do jargonFile (várias vezes como uma string), mas ele só está mostrando a primeira ocorrência na primeira linha. O hack string é encontrado várias vezes no jargonFile mas meu código está configurado para pesquisar apenas a primeira linha. Como posso ir sobre como resolver este problema?

Se isto não é clara o suficiente eu posso postar-se a atribuição se for necessário.

Foi útil?

Solução

Hmm, eu não sei nada sobre Python, mas parece-me que você não está interagindo através de todas as linhas do arquivo para a seqüência de pesquisa inseridos.

Normalmente, você precisa fazer algo como isto:

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

Assim, para seu 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, fiz uma pequena pesquisa sobre o DNS página fornecido e Python passa a ter o "com" palavra-chave. Exemplo:

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

Assim, uma outra forma de seu código poderia 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: ")

Note que "com" fecha o arquivo automaticamente quando você está feito.

Outras dicas

Primeiro você abre o arquivo e lê-lo em uma string com readline (). Mais tarde você tentar readline () da string que você obtida na primeira etapa.

Você precisa tomar cuidado com o objeto (coisa) que você está lidando com:. Open () deu-lhe um arquivo de "jargão", readline no jargão lhe deu a string "jargonFile"

faz isso jargonFile.readline não faz mais sentido

Update como resposta ao comentário:

Ok, agora que o problema de erro str é resolvido pensar sobre a estrutura do programa:

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

Você precisa mudar seu programa de modo segue-se que descripiton

Atualização II:

SD, se você quiser evitar reabrir o arquivo que você ainda precisa de duas voltas, mas desta vez um laço lê o arquivo na memória, quando isso é feito o segundo laço pede o termo de pesquisa. Então você estruturá-lo 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 pontos extra a partir do seu professor de acrescentar alguns comentários a sua solução que mencionam ambas as soluções possíveis e dizer por que você escolher o que você fez. Dica: Neste caso, é um trade-off clássico entre o tempo de execução (memória é rápido) e uso de memória (se o seu arquivo de jargões contém 100 milhões de entradas ... ok, você usaria algo mais complicado do que um arquivo simples, nesse caso, , bu você não pode carregá-lo na memória também.)

Ah e mais uma dica para a segunda solução: Python suporta tuplas ( "a", "b", "c") e listas [ "a", "b", "c"]. Você quer usar o último, porque lista pode ser modificada (a tupla não pode.)

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

==>

Hello
SD
How are you?

Tudo bem que último exemplo contém todo o material novo (lista, acrescentar à lista, laço sobre lista definir) para a segunda solução de seu programa. Divirta-se colocá-lo todos juntos.

Seu arquivo é jargon, não jargonFile (a string). Isso é provavelmente o que está causando a mensagem de erro. Você também precisará de um segundo loop para ler cada linha do arquivo desde o início até encontrar a palavra que você está procurando. Seu código pára procurarando atualmente se a palavra não é encontrada na linha atual do arquivo.

Que tal tentar escrever código que só dá a uma chance usuário digite uma string? Entrada essa seqüência, procure o arquivo até que você encontrá-lo (ou não) e de saída resultado. Depois de obter esse trabalho você pode voltar e adicionar o código que permite que várias pesquisas e termina em uma string vazia.

Update:

Para evitar a iteração os múltiplos arquivos vezes, você pode começar seu programa de sorver o arquivo inteiro em uma lista de cordas, uma linha de cada vez. Olhe-se o método readlines de objetos de arquivo. Você pode então procurar essa lista para cada entrada do usuário em vez de ler re-arquivo.

você não deve tentar re-inventar a roda. basta usar o re funções do módulo . seu programa poderia funcionar melhor se você usou: = resultar jargon.read (). ao invés de: = resultar jargon.readline (). então você pode usar a função re.findall () e juntar-se as cordas (com os índices) que você procurou com str.join () isso pode ficar um pouco confuso, mas se levar algum tempo para resolvê-lo, isso pode resolver o seu problema. a documentação python tem isso perfeitamente documentado

Toda vez que você digitar uma frase de pesquisa, olha para ele no próxima linha, não o primeiro. Você precisa re-abrir o arquivo para cada frase de pesquisa, se você quer que ele se comportar como você descreve.

Dê uma olhada na documentação para objetos de arquivo:

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

Você pode estar interessado no método readlines. Para um caso simples, onde o arquivo não é enorme, você poderia usar isso para ler todas as linhas em uma lista. Então, sempre que você começa uma nova seqüência de pesquisa, você pode executar toda a lista para ver se ele está lá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top