ti-enxame.com

qual é a diferença entre os.open e os.fdopen em python

Estou realmente confuso quando usar os.open E quando usar os.fdopen

Eu estava fazendo todo o meu trabalho com os.open E funcionou sem problemas, mas não consigo entender sob quais condições precisamos file descriptors E todas as outras funções como dup e fsync

O file object É diferente de file descriptor

eu quero dizer f = os.open("file.txt",w)

Agora é o objeto de arquivo ou o seu editor de arquivos?

33
user1994660

Você está confundindo a função interna open() com os.open() fornecida pelo módulo os. Eles são bem diferentes; os.open(filename, "w") não é válido Python (os.open aceita flags inteiros como seu segundo argumento), open(filename, "w") é.

Em resumo, open() cria novos objetos de arquivo, os.open() cria descritores de arquivo no nível do SO e os.fdopen() cria um objeto de arquivo a partir de um descritor de arquivo.

Os descritores de arquivo são um recurso de baixo nível para trabalhar com arquivos fornecidos diretamente pelo kernel do sistema operacional. Um descritor de arquivo é um pequeno número inteiro que identifica o arquivo aberto em uma tabela de arquivos abertos mantidos pelo kernel para cada processo. Várias chamadas do sistema aceitam descritores de arquivo, mas não são convenientes para trabalhar, geralmente exigindo buffers de largura fixa, várias tentativas em determinadas condições e tratamento manual de erros.

Os objetos de arquivo são Python que agrupam descritores de arquivos para tornar o trabalho com arquivos mais conveniente e menos propenso a erros. Eles fornecem, por exemplo, tratamento de erros, buffer, leitura linha por linha, conversões de charset e são fechadas quando o lixo é coletado.

Para recapitular:

  • Built-in open() pega um nome de arquivo e retorna um novo objeto de arquivo Python. Isso é o que você precisa na maioria dos casos.

  • os.open() pega um nome de arquivo e retorna um novo descritor de arquivo. Esse descritor de arquivo pode ser passado para outras funções de baixo nível, como os.read() e os.write() ou para os.fdopen(), conforme descrito abaixo. Você só precisa disso ao escrever código que depende de APIs dependentes do sistema operacional, como usar o sinalizador O_EXCL Para open(2).

  • os.fdopen() usa um descritor de arquivo existente - normalmente produzido por chamadas do sistema Unix, como pipe() ou dup(), e cria um Python efetivamente converte um descritor de arquivo em um objeto de arquivo completo, o que é útil ao fazer interface com o código C ou com APIs que apenas criam descritores de arquivo de baixo nível.

open interno pode ser implementado usando os.open() (para criar um descritor de arquivo) e os.fdopen() (para envolvê-lo em um objeto de arquivo):

# equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))
59
user4815162342