Para um exercício que estou fazendo, estou tentando ler o conteúdo de um determinado arquivo duas vezes usando o read()
método. Estranhamente, quando o chamo pela segunda vez, ele não parece retornar o conteúdo do arquivo como uma string?
Aqui está o código
f = f.open()
# get the year
match = re.search(r'Popularity in (\d+)', f.read())
if match:
print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())
if matches:
# matches is always None
Claro que sei que essa não é a maneira mais eficiente ou a melhor, esse não é o ponto aqui. A questão é: por que não posso ligar read()
duas vezes? Tenho que redefinir o identificador de arquivo? Ou feche / reabra o arquivo para fazer isso?
Respostas:
Chamar
read()
lê todo o arquivo e deixa o cursor de leitura no final do arquivo (sem nada mais para ler). Se você estiver olhando para ler um determinado número de linhas de cada vez que você poderia usarreadline()
,readlines()
ou iterate através de linhas comfor line in handle:
.Para responder à sua pergunta diretamente, uma vez que um arquivo foi lido,
read()
você pode usarseek(0)
para retornar o cursor de leitura ao início do arquivo (os documentos estão aqui ). Se você sabe que o arquivo não será muito grande, você também pode salvar aread()
saída em uma variável, usando-a em suas expressões findall.Ps. Não se esqueça de fechar o arquivo depois de terminar;)
fonte
with
.sim, como acima ...
vou escrever apenas um exemplo:
fonte
Todos que responderam a essa pergunta até agora estão absolutamente certos -
read()
percorrem o arquivo, então, depois de chamá-lo, você não pode chamá-lo novamente.O que acrescentarei é que, em seu caso particular, você não precisa voltar ao início ou reabrir o arquivo, você pode simplesmente armazenar o texto que leu em uma variável local e usá-lo duas vezes, ou quantas vezes você quiser, em seu programa:
fonte
from pathlib import Path; text = Path(filename).read_text()
Cuida de abrir, fechar, etc.O ponteiro de leitura move-se para depois do último byte / caractere lido. Use o
seek()
método para retroceder o ponteiro de leitura até o início.fonte
Cada arquivo aberto tem uma posição associada.
Quando você lê (), você lê daquela posição. Por exemplo,
read(10)
lê os primeiros 10 bytes de um arquivo recém-aberto, depois outroread(10)
lê os próximos 10 bytes.read()
sem argumentos lê todo o conteúdo do arquivo, deixando a posição do arquivo no final do arquivo. Na próxima vez que você ligar,read()
não haverá nada para ler.Você pode usar
seek
para mover a posição do arquivo. Ou provavelmente melhor no seu caso seria fazer umread()
e manter o resultado para ambas as pesquisas.fonte
read()
consome . Portanto, você pode redefinir o arquivo ou procurar o início antes de relê-lo. Ou, se for adequado para sua tarefa, você pode usarread(n)
para consumir apenasn
bytes.fonte
Sempre acho o método de leitura algo como uma caminhada por um beco escuro. Você desce um pouco e para, mas se não está contando seus passos, não tem certeza de quão longe está. Seek fornece a solução por reposicionamento, a outra opção é Tell, que retorna a posição ao longo do arquivo. Pode ser que o arquivo Python api possa combinar leitura e busca em um read_from (posição, bytes) para torná-lo mais simples - até que isso aconteça, você deve ler esta página .
fonte