Pergunta sobre python, file, file-io – Lendo e escrevendo arquivos em Python

1

Eu estou escrevendo um script que tem duas entradas:

um arquivo contendo uma lista de nomes,um arquivo diferente (pode estar vazio ou não vazio)

O objetivo do script é pegar os nomes do primeiro arquivo, acessar uma determinada API e obter informações sobre cada nome e, em seguida, gravar essas informações no segundo arquivo. Se o segundo arquivo já contiver informações, o script lerá a última linha do arquivo gravado, localizará essa entrada no primeiro arquivo e, em seguida, iniciará a partir dessa entrada. Estou tendo problemas, no entanto, quando se trata de ler e gravar no segundo arquivo.

Quando eu definir o segundo tipo de arquivo para "r +" e, em seguida, fazer uma impressão em file_two.read (), ele mostra o conteúdo do segundo arquivo. Quando faço outra impressão na linha seguinte, mostra o arquivo como vazio. Além disso, quando defino o tipo de arquivo como "a +", ele mostra o arquivo completamente vazio nas duas vezes, embora eu possa ver claramente que as informações no arquivo de texto estão realmente lá. Alguém sabe o que está acontecendo?

Aqui está o segmento de código que lida com a escrita:

<code>def write_to_file(filename, users):
    pages = range(0, len(users) - 100, 100)
    for page in pages:
        user_names = get_users(users[page: page+100])
        lines = [format_user(user) for user in user_names]
        output_text = '\n'.join(lines)
        with filename as output_file:
            output_file.write(output_text.encode('utf-8'))
</code>

e aqui está o segmento de código que chama a função acima.

<code>file_one = args.file1
file_two = args.file2
users = read_names_automatic(file_one)
write_to_file(file_two, users)
</code>
o arquivo já foi aberto anteriormente no script usando argparse, esse código simplesmente grava todas as informações no arquivo e fecha o arquivo assim que ele é feito. user1389884
Éwith filename as output_file: um erro de digitação? Eu acho que você quer dizerwith open(filename, 'a+') as output_file:. modocache

Sua resposta

1   a resposta
3

r +" e, em seguida, fazer uma impressão em file_two.read (), ele mostra o conteúdo do segundo arquivo. Quando faço outra impressão na linha seguinte, mostra o arquivo como vazio.

Sim, isso é um comportamento esperado. O ponteiro do arquivo está apontando para o final do arquivo no final defile_two.read()Assim, qualquer tentativa de ler mais retorna uma string vazia. Por exemplo, confira o seguinte:

<code>with open("test.txt") as f:
    print f.readline() # => prints the first line, sets file pointer to second line
    print f.read() # => prints everything from the second line on
</code>

Para redefinir o ponteiro do arquivo para o início do arquivo:

<code>with open("test.txt") as f:
    print f.read() # => prints entire file, sets file pointer to end of file
    f.seek(0) # => reset file pointer to beginning of file
    print f.read() # => prints entire file
</code>

Além disso, quando defino o tipo de arquivo como "a +", ele mostra o arquivo completamente vazio nas duas vezes, embora eu possa ver claramente que as informações no arquivo de texto estão realmente lá.

Quando vocêopen("test.txt", "a+"), o ponteiro do arquivo é definido para o final do arquivo, portanto, qualquer tentativa de leitura produzirá uma seqüência vazia. De fato, é isso que permite que vocêacrescentar para o arquivo. Se vocêsfile_two.seek(0) e depoisfile_two.write(), o texto escrito será adicionado ao início defile_two.

Perguntas relacionadas