파이썬에서 파일 생성 및 수정 날짜 / 시간을 얻는 방법?


932

파일 생성 및 수정 날짜를 기준으로 몇 가지 작업을 수행해야하지만 LinuxWindows 에서 실행 해야하는 스크립트가 있습니다.

파이썬 에서 파일 생성 및 수정을 얻는 가장 좋은 크로스 플랫폼 방법 은 무엇입니까 ?date/times


57
크로스 플랫폼 방식으로는 파일 작성 시간을 얻을 수 없습니다. 참조 docs.python.org/library/os.path.html#os.path.getctime
문양

답변:


620

크로스 플랫폼 방식으로 일종의 수정 날짜를 얻는 것은 쉽습니다. 전화 하면 파일 이 마지막으로 수정 된 시점의 Unix 타임 스탬프가 표시됩니다 .os.path.getmtime(path)path

반면에 파일 생성 날짜를 얻는 것은 세 가지 큰 OS 사이에서도 차이가 있으며 플랫폼에 따라 다릅니다.

이 모든 것을 종합하면 크로스 플랫폼 코드는 다음과 같아야합니다.

import os
import platform

def creation_date(path_to_file):
    """
    Try to get the date that a file was created, falling back to when it was
    last modified if that isn't possible.
    See http://stackoverflow.com/a/39501288/1709587 for explanation.
    """
    if platform.system() == 'Windows':
        return os.path.getctime(path_to_file)
    else:
        stat = os.stat(path_to_file)
        try:
            return stat.st_birthtime
        except AttributeError:
            # We're probably on Linux. No easy way to get creation dates here,
            # so we'll settle for when its content was last modified.
            return stat.st_mtime

9
나는 이것을 함께 던지기 위해 최선을 다했고 (그리고 프로세스에서 연구하는 데 몇 시간을 보냈다), 나는 이전에 있었던 대답보다 적어도 더 정확 하다고 확신 하지만 이것은 정말 어려운 주제이며 나는 ' 사람들이 제공 할 수있는 모든 수정, 설명 또는 기타 의견에 감사합니다. 특히, ext4Linux의 드라이브 에서이 데이터에 액세스하는 방법을 만들고 싶습니다. Linux에서 Windows가 작성한 파일을 읽을 때 또는 그 반대로 st_ctime다르게 사용하는 경우 vica가 어떻게되는지 알고 싶습니다 .
Mark Amery

25
솔직히 파일 작성 시간은 일반적으로 쓸모가 없습니다. mode로 쓰기 위해 기존 파일을 열면 파일 "w"이 바뀌지 않고 기존 파일이 열리고 잘립니다. 파일 내용이 파일을 만들 때의 내용과 완전히 관련이 없지만 현재 버전보다 훨씬 앞서 파일이 "만들 렸다"는 메시지가 표시됩니다. 반대로, 원자 파일을 저장할 때 원자 바꾸기를 사용하는 편집기 (원본 파일은 새로운 진행중인 작업 임시 파일로 대체 됨)는 한 문자 만 삭제하더라도 최근 생성 날짜를 표시합니다. 수정 시간을 사용하고 생성 시간을 애무하지 마십시오.
ShadowRanger

3
몇 년 후, 나는 마침내 파일 생성 시간에 대한 사용을 발견했습니다! 특정 디렉토리에서 파일 이름 지정 규칙을 확인하는 코드를 작성 중이므로 우선 규칙이 지정된 후에 이름이 지정된 파일을 고려하고 싶습니다. 전체 내용 (mtime)을 대체하는 것은 무의미합니다. 이미 존재하는 경우에는 조부모입니다.
Steve Jessop

1
안녕 마크. 단순화를 제안합니다. stat.st_ctime많은 경우, 마지막 메타 데이터 변경 시간이 생성 시간이 될 수 있기 때문에 ( 리눅스에서) 반환하는 것이 더 적절 합니다 (적어도 ctime실제 생성 시간 보다 mtime). 따라서 스 니펫을로 간단히 바꿀 수 있습니다 stat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime. 어떻게 생각해? 건배
올리버

4
@olibre "최소한 ctime은 mtime보다 실제 생성 시간에 더 가깝습니다" -아닙니다. 이것은 내가 여러 번 언급 한 것이지만 완전히 거짓입니다. 수동으로 아이 노드의 값을 엉망하지 않는 한, ctime항상 또는 동일해야 나중에 보다 mtime때문에, mtime변화 의 원인ctime 합니다 (때문에 변화 mtime자체가 "메타 데이터"로 간주됩니다). stackoverflow.com/a/39521489/1709587을 참조하십시오 .
Mark Amery

676

몇 가지 선택이 있습니다. 우선, os.path.getmtimeos.path.getctime기능을 사용할 수 있습니다 .

import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))

다른 옵션은 다음을 사용하는 것입니다 os.stat.

import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))

참고 : ctime()않습니다 하지 * 괜찬아 시스템에서 생성 시간을 참조 아니라 마지막 시간은 아이 노드의 데이터가 변경되었습니다. (재미있는 블로그 게시물에 대한 링크를 제공하여 의견을 더 명확하게 해준 kojiro에게 감사드립니다)


169
누군가가 질문에 대한 @Glyph의 의견을 놓친 경우를 대비하여 ctime은 POSIX 시스템에서 생성 시간을 의미하지 않습니다 . 지난 3 년간 얼마나 많은 사람들이이 게시물을 감추고 버그 코드를 작성했는지 궁금합니다.
kojiro

16
첫 번째 예는 날짜 시간이나 숫자가 아니라 문자열을 제공합니다.
gak

1
@kojiro 링크 된 블로그 게시물은 Unix에서 파일의 ctime (가)마다 업데이트되는 mtime합니다 (이후 않습니다 mtime"메타 데이터"입니다), 그리고 그래서 ctime일반적으로 항상 동일 또는 앞으로의mtime . ctime"창조 된"시간으로 취급하는 것은 전혀 의미가 없습니다. -1!
Mark Amery

첫 번째 옵션은 파일 생성과 마지막 수정 모두에 대해 동일한 결과를 반환합니다! Last modified: Fri Jan 31 11:08:13 2020그리고 Created: Fri Jan 31 11:08:13 2020Linux Ubuntu 16.04에서!
Färid Alijani

time.ctime(os.path.getmtime(file))파일이 시스템 또는 사용자에 의해 수정되었는지 여부에 따라 2 가지 유형의 문자열 을 반환 한다는 것을 알았습니다 . 시스템에 의해 수정 된 경우 문자열에는 월과 일 사이에 2 개의 공백이 있습니다. 이유를 모르겠습니다
Matteo Antolini

376

이를 위해 사용하는 가장 좋은 함수는 os.path.getmtime () 입니다. 내부적으로 이것은 단지을 사용합니다 os.stat(filename).st_mtime.

datetime 모듈은 타임 스탬프를 가장 잘 조작하므로 수정 날짜를 다음 datetime과 같은 객체 로 얻을 수 있습니다 .

import os
import datetime
def modification_date(filename):
    t = os.path.getmtime(filename)
    return datetime.datetime.fromtimestamp(t)

사용 예 :

>>> d = modification_date('/var/log/syslog')
>>> print d
2009-10-06 10:50:01
>>> print repr(d)
datetime.datetime(2009, 10, 6, 10, 50, 1)

1
이 답변도 약간 잘못되었습니다. getmtime은 Unix에서 사용할 수있는 가장 가까운 것입니다 (생성 날짜를 얻을 수없는 경우) .Windows에서 사용하는 가장 좋은 기능은 아닙니다 ctime. 생성 시간입니다.
Mark Amery

3
@MarkAmery-이 답변은 수정 시간에 관한 것입니다.
ArtOfWarfare

47

os.stat https://docs.python.org/2/library/stat.html#module-stat

편집 : 최신 코드에서는 os.path.getmtime () (Christian Oudard 덕분에 )을 사용해야
하지만 소수점 이하의 시간으로 time_t의 부동 소수점 값을 반환합니다 (OS가 지원하는 경우)


44
이를 위해 os.path.getmtime ()이 더 단순 해졌습니다.
Christian Oudard

5
여기서 "최신 코드"절은 약간 오해의 소지가 있습니다. os.path.getmtime()는 파이썬 1.5.2 ( 오래된 문서 참조 ) 이후로 사용되었으며, 대부분의 아기 치아를 잃기 전에 출시되었으며 거의 ​​10 년 전에이 답변의 원본을 작성했습니다.
Mark Amery

39

os.path.getmtime () 또는 os.stat () 모드 시간을 가져 오는 두 가지 방법이 있지만 ctime은 플랫폼 간 신뢰할 수 없습니다 (아래 참조).

os.path.getmtime ()

getmtime ( path ) 경로
를 마지막으로 수정 한 시간을 반환합니다. 반환 값은 신기원 이후의 초 수를 나타내는 숫자입니다 (시간 모듈 참조). 파일이 없거나 액세스 할 수없는 경우 os.error를 발생 시키십시오. 버전 1.5.2의 새로운 기능 버전 2.3으로 변경 : os.stat_float_times ()가 True를 반환하면 결과는 부동 소수점 숫자입니다.

os.stat ()

stat ( path )
주어진 경로에서 stat () 시스템 호출을 수행합니다. 리턴 값은 속성이 통계 구조의 멤버에 해당하는 오브젝트입니다. 즉, st_mode (보호 비트), st_ino (inode 번호), st_dev (장치), st_nlink (하드 링크 수), st_uid (소유자의 사용자 ID) ), st_gid (소유자의 그룹 ID), st_size (파일 크기, 바이트), st_atime (가장 최근 액세스 한 시간 ), st_mtime (가장 최근 컨텐츠 수정 시간), st_ctime (플랫폼 종속, 최근 메타 데이터 변경 시간 유닉스에서 또는 Windows에서 생성 시간) :

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

위 예제에서 statinfo.st_mtime 또는 statinfo.st_ctime을 사용하여 각각 mtime 및 ctime을 가져옵니다.


13

Python 3.4 이상에서는 많은 os 모듈에 대한 래퍼를 포함 하는 객체 지향 pathlib 모듈 인터페이스를 사용할 수 있습니다 . 다음은 파일 통계를 얻는 예입니다.

>>> import pathlib
>>> fname = pathlib.Path('test.py')
>>> assert fname.exists(), f'No such file: {fname}'  # check that the file exists
>>> print(fname.stat())
os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)

무엇에 대한 자세한 내용은 os.stat_result포함, 참조 문서 . 원하는 수정 시간 동안 fname.stat().st_mtime:

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)

Windows에서 생성 시간을 원하거나 Unix에서 가장 최신 메타 데이터를 변경하려면 다음을 사용하십시오 fname.stat().st_ctime.

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

이 기사 에는 pathlib 모듈에 대한 더 유용한 정보와 예제가 있습니다.


11

os.statst_mtimest_ctime속성을 가진 명명 된 튜플을 반환 합니다. 수정 시간은 st_mtime두 플랫폼 모두에 있습니다. 불행히도 Windows에서는 ctime"생성 시간"을 의미하고 POSIX에서는 "변경 시간"을 의미합니다. POSIX 플랫폼에서 생성 시간을 얻는 방법을 모르겠습니다.


다음은 태그가 추가 된 튜플에 대한 자세한 내용입니다. stackoverflow.com/questions/2970608/… 튜플처럼 작동하지만 시도해보십시오 dir(..). 예 :dir(os.stat(os.listdir('.')[0]))
Evgeni Sergeev

9
import os, time, datetime

file = "somefile.txt"
print(file)

print("Modified")
print(os.stat(file)[-2])
print(os.stat(file).st_mtime)
print(os.path.getmtime(file))

print()

print("Created")
print(os.stat(file)[-1])
print(os.stat(file).st_ctime)
print(os.path.getctime(file))

print()

modified = os.path.getmtime(file)
print("Date modified: "+time.ctime(modified))
print("Date modified:",datetime.datetime.fromtimestamp(modified))
year,month,day,hour,minute,second=time.localtime(modified)[:-3]
print("Date modified: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

print()

created = os.path.getctime(file)
print("Date created: "+time.ctime(created))
print("Date created:",datetime.datetime.fromtimestamp(created))
year,month,day,hour,minute,second=time.localtime(created)[:-3]
print("Date created: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

인쇄물

somefile.txt
Modified
1429613446
1429613446.0
1429613446.0

Created
1517491049
1517491049.28306
1517491049.28306

Date modified: Tue Apr 21 11:50:46 2015
Date modified: 2015-04-21 11:50:46
Date modified: 21/04/2015 11:50:46

Date created: Thu Feb  1 13:17:29 2018
Date created: 2018-02-01 13:17:29.283060
Date created: 01/02/2018 13:17:29

-1 : 다른 답변과 마찬가지로 Windows에서 파일을 만드는 시간을 제공하지 않습니다 (다시 한 번도 답변에 언급되지 않음).
ntninja

@ntninja 확실합니까? 나는 Windows 만 사용하고 이것은 절대적으로 작동합니다. 나는 2015 년 초에이 스크립트를 썼습니다. 나는 다른 사람들보다 더 명확하고 요점까지 정확하고 완벽하게 설명되어 있습니다. (내가 이전에 사용하던 스크립트 대신 여기에 새로운 것을 찾겠다 고 결심했다. 그렇다. 이것이 바로 그 방법이다)
Puddle

오, 나는 "… Windows에 있지 않으면 파일의 생성 시간을주지 않을 것입니다"라고 말하려고했습니다 . 죄송합니다! 사실이 답변은 이식 가능하지 않으며이 사실을 언급하지 않습니다. (Linux 출력 예 : pastebin.com/50r5vGBE )
ntninja

@ntninja 당신은 다른 사람에게 갈거야?
웅덩이

이미 다른 의견을 남겼으며 곧 (최근) Linux에서 작동하는 답변을 게시 할 것입니다. 그러나 실제로 게시물의 잘못된 점은이 사실을 언급하지 않는 Windows 전용 답변이라는 것입니다. 문제에서 OP는 구체적으로 Windows 및 Linux 호환 솔루션을 요구했습니다. 따라서이 "세부 사항"을 맨 위에 추가하면 사람들이 ctime이 여러 플랫폼을 대상으로 할 때 찾고있는 것이라고 생각하는 데 오해하지 않도록 매우 도움이 될 것이라고 생각합니다.
ntninja

2
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 

-1 : 다른 곳에서 언급했듯이 Windows에 있지 않으면 (응답조차 언급하지 않습니다!) 파일 작성 시간을 제공하지 않습니다.
ntninja

0

다음과 같은 기호 링크가 중요하지 않은 경우 os.lstat내장 을 사용할 수도 있습니다 .

>>> os.lstat("2048.py")
posix.stat_result(st_mode=33188, st_ino=4172202, st_dev=16777218L, st_nlink=1, st_uid=501, st_gid=20, st_size=2078, st_atime=1423378041, st_mtime=1423377552, st_ctime=1423377553)
>>> os.lstat("2048.py").st_atime
1423378041.0

이것은 마지막으로 읽은 시간 (적어도 유닉스에서)을 줄 입니다.
Mark Amery

0

crtime파일 생성 시간에 플랫폼 간 액세스를 구현 하는 라이브러리를 살펴볼 가치가 있습니다.

from crtime import get_crtimes_in_dir

for fname, date in get_crtimes_in_dir(".", raise_on_error=True, as_epoch=False):
    print(fname, date)
    # file_a.py Mon Mar 18 20:51:18 CET 2019

1
나는 이것에 대해 강력히 권고한다 : 그것은 debugfs정의상 불안정하고 모든 것에 대한 최상위 루트 액세스가 필요한 리눅스에서 사용 하며 거의 모든면에서 어머니가 항상 경고하는 것들 중 하나 인 경향이있다. (그렇습니다. 보안 부팅이 필요없는 시스템에서 정말로 절망적이며 실제 수퍼 유저 인 경우에는 가능합니다.)
ntninja

@ntninja 필자는 프로덕션 환경에서 절대로 사용하지 않았지만 "홈 스크립팅"에 유용 할 수 있습니다.
Delgan

-2

os.stat생성 시간은 포함되지 않습니다. os.stat()시간을 포함하는 요소에 대한 st_anything 정의는 없습니다 .

따라서 이것을 시도하십시오 :

os.stat('feedparser.py')[8]

ls -lah의 파일에서 생성 날짜와 비교하십시오.

그들은 같아야합니다.


6
잘못된! os.stat ( 'feedparser.py') [8]은 생성 시간이 아니라 st_mtime을 나타냅니다. 다음 문서를 참조하십시오 : docs.python.org/library/os.html#os.stat
millerdev

4
못생긴 숫자 대신 .st_ctime을 사용하십시오 [8].
guettli

-3

시스템의 stat 명령을 실행하고 출력을 파싱하여 posix에서 생성 시간을 얻을 수있었습니다.

commands.getoutput('stat FILENAME').split('\"')[7]

터미널 (OS X)에서 파이썬 외부에서 통계를 실행하면 다음이 반환되었습니다.

805306374 3382786932 -rwx------ 1 km staff 0 1098083 "Aug 29 12:02:05 2013" "Aug 29 12:02:05 2013" "Aug 29 12:02:20 2013" "Aug 27 12:35:28 2013" 61440 2150 0 testfile.txt

... 여기서 네 번째 날짜 시간은 파일 작성입니다 (다른 주석에서 언급 한 것처럼 ctime 변경 시간이 아님).


13
-1 : 쉘 명령에서 인간을위한 출력을 파싱하는 것은 매우 나쁜 생각입니다. 그리고이 명령은 상호 호환되지도 않습니다.
MestreLion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.