Eu tenho um script que precisa fazer algumas coisas com base nas datas de criação e modificação de arquivos, mas que deve ser executado no Linux e Windows .
Qual é a melhor maneira de plataforma cruzada para obter criação e modificação de arquivos date/times
no Python ?
Respostas:
É fácil obter algum tipo de data de modificação em uma plataforma cruzada - basta ligar e você receberá o carimbo de data e hora do Unix de quando o arquivo foi modificado pela última vez.
os.path.getmtime(path)
path
A obtenção de datas de criação de arquivo , por outro lado, é complicada e depende da plataforma, diferindo mesmo entre os três grandes sistemas operacionais:
ctime
(documentado em https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) armazena sua data de criação. Você pode acessá-lo no Python atravésos.path.getctime()
do.st_ctime
atributo do resultado de uma chamada paraos.stat()
. Isso não funcionará no Unix, ondectime
é a última vez que os atributos ou o conteúdo do arquivo foram alterados ..st_birthtime
atributo do resultado de uma chamada paraos.stat()
.No Linux , isso é atualmente impossível, pelo menos sem escrever uma extensão C para Python. Embora alguns sistemas de arquivos comumente usados com o Linux armazenem datas de criação (por exemplo, as
ext4
armazenest_crtime
), o kernel do Linux não oferece nenhuma maneira de acessá-las ; em particular, as estruturas retornadas pelasstat()
chamadas em C, a partir da versão mais recente do kernel, não contêm nenhum campo de data de criação . Você também pode ver que o identificadorst_crtime
atualmente não aparece em nenhum lugar da fonte Python . Pelo menos se você estiver emext4
, os dados é anexado aos inodes no sistema de arquivos, mas não há nenhuma maneira conveniente de acessá-lo.A próxima melhor coisa no Linux é acessar os arquivos
mtime
, atravésos.path.getmtime()
do.st_mtime
atributo ou de umos.stat()
resultado. Isso fornecerá a última vez que o conteúdo do arquivo foi modificado, o que pode ser adequado para alguns casos de uso.Juntando tudo isso, o código de plataforma cruzada deve se parecer com isso ...
fonte
ext4
unidades no Linux, e gostaria de saber o que acontece quando o Linux lê arquivos escritos pelo Windows, ou vice-versa, uma vez que eles usam de maneirast_ctime
diferente."w"
, ele não está sendo substituído, ele apenas abre o arquivo existente e o trunca. Mesmo que o conteúdo do arquivo não esteja completamente relacionado ao que havia na criação, você ainda seria informado de que o arquivo foi "criado" muito antes da versão atual. Por outro lado, os editores que usam substituição atômica ao salvar (o arquivo original é substituído por um novo arquivo temporário de trabalho em andamento) mostram uma data de criação mais recente, mesmo se você tiver excluído apenas um caractere. Use o tempo de modificação, não faça grub pelo tempo de criação.stat.st_ctime
é mais pertinente porque, em muitos casos, o tempo de última alteração de metadados pode ser a hora de criação (pelo menosctime
é mais próxima ao real tempo de criação do quemtime
). Portanto, você pode simplesmente substituir seu snippet porstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
. O que você acha? Cheersctime
sempre deve ser igual ou posterior amtime
, porque umamtime
alteração causa umactime
alteração (porquemtime
ela mesma é considerada "metadados"). Consulte stackoverflow.com/a/39521489/1709587, onde forneço alguns códigos de exemplo para ilustrar isso.Você tem algumas opções. Por um lado, você pode usar as funções
os.path.getmtime
eos.path.getctime
:Sua outra opção é usar
os.stat
:Nota :
ctime()
não se refere ao horário de criação nos sistemas * nix, mas na última vez em que os dados do inode foram alterados. (obrigado a kojiro por deixar esse fato mais claro nos comentários, fornecendo um link para um post interessante no blog)fonte
ctime
é atualizado sempre que omtime
faz (uma vez que omtime
é "metadados"), e assim octime
é normalmente sempre igual a ou antes de omtime
. Tratarctime
como tempo "criado", portanto, não faz nenhum sentido. -1!Last modified: Fri Jan 31 11:08:13 2020
eCreated: Fri Jan 31 11:08:13 2020
no Linux Ubuntu 16.04!time.ctime(os.path.getmtime(file))
retorna 2 tipos de strings, dependendo se o arquivo foi modificado pelo sistema ou pelo usuário. Se tiver sido modificado pelo sistema, a sequência terá 2 espaços entre o mês e o dia. Não sei porquêA melhor função a ser usada para isso é os.path.getmtime () . Internamente, isso apenas usa
os.stat(filename).st_mtime
.O módulo datetime é o melhor registro de data e hora de manipulação, para que você possa obter a data da modificação como um
datetime
objeto como este:Exemplo de uso:
fonte
getmtime
é a coisa mais próxima disponível no Unix (onde a obtenção de datas de criação não é possível), mas definitivamente não é a melhor função a ser usada no Windows, ondectime
é o momento da criação.os.stat https://docs.python.org/2/library/stat.html#module-stat
edit: No código mais recente, você provavelmente deve usar os.path.getmtime () (obrigado Christian Oudard)
mas observe que ele retorna um valor de ponto flutuante de time_t com fração de segundos (se o seu sistema operacional suportar)
fonte
os.path.getmtime()
existe desde o Python 1.5.2 (consulte os documentos antigos ), lançado antes que eu perdesse a maioria dos meus dentes de leite e quase uma década antes de você escrever a versão original desta resposta.Existem dois métodos para obter o horário da modificação, os.path.getmtime () ou os.stat (), mas o ctime não é confiável entre plataformas (veja abaixo).
os.path.getmtime ()
getmtime ( caminho )
Retorna a hora da última modificação do caminho. O valor de retorno é um número que indica o número de segundos desde a época (consulte o módulo de tempo). Aumente o arquivo os.error se o arquivo não existir ou estiver inacessível. Novo na versão 1.5.2. Alterado na versão 2.3: Se os.stat_float_times () retornar True, o resultado será um número de ponto flutuante.
os.stat ()
stat ( caminho )
Execute uma chamada de sistema stat () no caminho especificado. O valor de retorno é um objeto cujos atributos correspondem aos membros da estrutura stat, a saber: st_mode (bits de proteção), st_ino (número de inode), st_dev (dispositivo), st_nlink (número de links físicos), st_uid (ID do usuário do proprietário ), st_gid (ID do grupo do proprietário), st_size (tamanho do arquivo, em bytes), st_atime (hora do acesso mais recente), st_mtime (hora da modificação do conteúdo mais recente), st_ctime (dependente da plataforma; hora da alteração mais recente dos metadados) no Unix ou no momento da criação no Windows) :
No exemplo acima, você usaria statinfo.st_mtime ou statinfo.st_ctime para obter o mtime e o ctime, respectivamente.
fonte
No Python 3.4 e acima, você pode usar a interface do módulo pathlib orientada a objetos , que inclui wrappers para grande parte do módulo os. Aqui está um exemplo de como obter as estatísticas do arquivo.
Para mais informações sobre o que
os.stat_result
contém, consulte a documentação . Para o tempo de modificação que você desejafname.stat().st_mtime
:Se você quiser o horário de criação no Windows ou a alteração mais recente dos metadados no Unix, use
fname.stat().st_ctime
:Este artigo tem informações e exemplos mais úteis para o módulo pathlib.
fonte
os.stat
retorna uma tupla nomeada comst_mtime
est_ctime
atributos. O tempo de modificação ést_mtime
nas duas plataformas; infelizmente, no Windows,ctime
significa "hora da criação", enquanto no POSIX, significa "hora da mudança". Não conheço nenhuma maneira de obter o tempo de criação nas plataformas POSIX.fonte
dir(..)
uma. Por exemplodir(os.stat(os.listdir('.')[0]))
impressões
fonte
fonte
Se os links simbólicos a seguir não forem importantes, você também poderá usar o
os.lstat
built-in.fonte
Vale a pena dar uma olhada na
crtime
biblioteca que implementa o acesso entre plataformas ao tempo de criação do arquivo.fonte
debugfs
no Linux, que é por definição instável, requer acesso root de alto nível para tudo e, em quase todos os aspectos, tende a ser uma das coisas que sua mãe sempre o alertou. (Mas sim, provavelmente funcionará se você estiver realmente desesperado e for o verdadeiro superusuário de um sistema sem inicialização segura…)os.stat
inclui o tempo de criação. Simplesmente não há definição de st_anything para o elemento deos.stat()
que contém o tempo.Então tente o seguinte:
os.stat('feedparser.py')[8]
Compare isso com a sua data de criação no arquivo em ls -lah
Eles deveriam ser os mesmos.
fonte
Consegui obter tempo de criação no posix executando o comando stat do sistema e analisando a saída.
A execução do stat fora do python do Terminal (OS X) retornou:
... onde a quarta data e hora é a criação do arquivo (em vez da hora de alteração do ctime, como outros comentários observados).
fonte