touch
é um utilitário Unix que define os horários de modificação e acesso dos arquivos para a hora atual do dia. Se o arquivo não existir, ele será criado com permissões padrão.
Como você o implementaria como uma função Python? Tente ser multiplataforma e completo.
(Os resultados atuais do Google para "python touch file" não são tão bons assim, mas apontam para os.utime .)
touch
funcionalidades semelhantes em seus programas Python, não como reimplementá-las do zero; essas pessoas são melhor atendidas rolando para baixo até apathlib
solução. Embora agora esteja integrada, esta resposta tem uma classificação do Google muito melhor para "arquivo de toque python" do que a documentação relevante .Respostas:
Parece que isso é novo a partir do Python 3.4 -
pathlib
.Isso criará um
file.txt
no caminho.-
fonte
pip install pathlib
Path('/some/path').mkdir()
se o diretório que contém o arquivo a sertouch()
editado ainda não existir.pathlib2
vez depathlib
porquepathlib
é apenas correção de bugs agora. Portanto, no Python 2.7:pip install pathlib2
e depoisfrom pathlib2 import Path
.Isso tenta ser um pouco mais livre de corrida do que as outras soluções. (A
with
palavra-chave é nova no Python 2.5.)Aproximadamente equivalente a isso.
Agora, para realmente torná-lo livre de corrida, você precisa usar
futimes
e alterar o carimbo de data / hora do identificador de arquivo aberto, em vez de abrir o arquivo e depois alterar o carimbo de data / hora no nome do arquivo (que pode ter sido renomeado). Infelizmente, o Python não parece fornecer uma maneira de ligarfutimes
sem passar por algoctypes
semelhante ...EDITAR
Conforme observado por Nate Parsons , o Python 3.3 adicionará a especificação de um descritor de arquivo (quando
os.supports_fd
) a funções comoos.utime
, que usará ofutimes
syscall em vez doutimes
syscall sob o capô. Em outras palavras:fonte
file
função interna foi removida do Python 3 eopen
deve ser usada. Eu perdi totalmente isto porque o destaque de sintaxe do editor Eu estou usando (gedit) ainda é alvo Python 2.fonte
open()
chamada, o conteúdo do arquivo será truncado. Sugira usar o modo'a'
.open(fname, 'a').close()
não mudará no momento.os.utime()
lá para arquivos pré-existentes.Por que não tentar isso ?:
Eu acredito que isso elimina qualquer condição de corrida que importa. Se o arquivo não existir, uma exceção será lançada.
A única condição de corrida possível aqui é se o arquivo for criado antes que open () seja chamado, mas após os.utime (). Mas isso não importa, pois, neste caso, o tempo de modificação será o esperado, pois deve ter ocorrido durante a chamada para tocar em ().
fonte
Aqui está um código que usa ctypes (testado apenas no Linux):
fonte
Esta resposta é compatível com todas as versões desde o Python-2.5 quando a palavra
with
- chave foi lançada.1. Crie um arquivo se ele não existir + Defina a hora atual
(exatamente o mesmo que o comando
touch
)Uma versão mais robusta:
2. Basta criar o arquivo se ele não existir
(não atualiza a hora)
3. Basta atualizar o acesso ao arquivo / horários modificados
(não cria arquivo, se não existir)
O uso
os.path.exists()
não simplifica o código:Bônus: hora da atualização de todos os arquivos em um diretório
fonte
fonte
with open(fn,'a'): pass
ou alternativaopen(fn, 'a').close()
, não altere o horário modificado usando o Python 2.7.5 no Red Hat 7 (o sistema de arquivos é XFS). Na minha plataforma, essas soluções apenas criam um arquivo vazio, se não existir. : - /Simplista:
open
garante que haja um arquivo láutime
garante que o timestamps são atualizadosTeoricamente, é possível que alguém exclua o arquivo após o
open
, fazendo com que o utime gere uma exceção. Mas sem dúvida está tudo bem, já que algo ruim aconteceu.fonte
Complexo (possivelmente com buggy):
Isso tenta também permitir definir o horário de acesso ou modificação, como o GNU touch.
fonte
Pode parecer lógico criar uma string com as variáveis desejadas e passá-la para os.system:
Isso é inadequado de várias maneiras (por exemplo, ele não lida com espaços em branco), portanto, não faça isso.
Um método mais robusto é usar o subprocesso:
subprocess.call(['touch', os.path.join(dirname, fileName)])
Embora isso seja muito melhor do que usar um subshell (com os.system), ele ainda é adequado apenas para scripts rápidos e sujos; use a resposta aceita para programas de plataforma cruzada.
fonte
subprocess.call(['touch', os.path.join(dirname, fileName)])
é muito melhor do que usar um subshell (comos.system
). Ainda assim, use isso apenas para scripts rápidos e sujos, use a resposta aceita para programas de plataforma cruzada.touch
não é um cross-platform comando disponível (por exemplo, Windows)"open (file_name, 'a'). close ()" não funcionou para mim no Python 2.7 no Windows. "os.utime (nome_do_arquivo, Nenhum)" funcionou bem.
Além disso, eu precisava tocar recursivamente todos os arquivos em um diretório com uma data anterior a outra. Criei o seguinte com base na resposta muito útil do ephemient.
fonte
Por que você não tenta: newfile.py
ou
fonte
O seguinte é suficiente:
Se você deseja definir um horário específico para o toque, use os.utime da seguinte maneira:
Aqui, atime e mtime devem ser int / float e devem ser iguais ao tempo da época, em segundos, ao tempo que você deseja definir.
fonte
Se você não se importa com a tentativa, exceto ...
Porém, se um arquivo existir com o mesmo nome, ele não funcionará e falhará silenciosamente.
fonte
write_text()
depathlib.Path
pode ser usado.fonte