답변:
크로스 플랫폼 방식으로 일종의 수정 날짜를 얻는 것은 쉽습니다. 전화 하면 파일 이 마지막으로 수정 된 시점의 Unix 타임 스탬프가 표시됩니다 .os.path.getmtime(path)path
반면에 파일 생성 날짜를 얻는 것은 세 가지 큰 OS 사이에서도 차이가 있으며 플랫폼에 따라 다릅니다.
ctime(문서화 https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx는 ) 생성 날짜를 저장합니다. 파이썬에서 os.path.getctime()또는 .st_ctime에 대한 호출 결과의 속성을 통해 이것에 액세스 할 수 있습니다 os.stat(). 이것은 하지 않을 것이다 (가) 유닉스, 작업 ctime 파일의 속성 마지막 시간입니다 또는 내용이 변경되었습니다 ..st_birthtime에 대한 호출의 결과의 속성을 os.stat().에 리눅스 , 이것은 파이썬의 C 확장을 작성하지 않고 적어도 현재 불가능하다. Linux에서 일반적으로 사용되는 일부 파일 시스템 은 작성 날짜를 저장 하지만 (예 :에 ext4저장 st_crtime) Linux 커널 은 파일을 액세스 할 수있는 방법을 제공하지 않습니다 . 특히 stat()최신 커널 버전 부터 C 호출에서 반환되는 구조체 에는 생성 날짜 필드가 포함되어 있지 않습니다 . 또한 식별자 st_crtime가 현재 Python 소스의 어느 곳에도 포함되어 있지 않음을 알 수 있습니다 . 적어도 on ext4인 경우 데이터 는 파일 시스템의 inode에 연결되지만 편리한 액세스 방법은 없습니다.
Linux에서 가장 좋은 것은 결과 또는 속성을 mtime통해 파일에 액세스 하는 것입니다. 이렇게하면 파일의 내용이 마지막으로 수정 된 시간이 주어 지므로 일부 사용 사례에 적합 할 수 있습니다.os.path.getmtime().st_mtimeos.stat()
이 모든 것을 종합하면 크로스 플랫폼 코드는 다음과 같아야합니다.
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
ext4Linux의 드라이브 에서이 데이터에 액세스하는 방법을 만들고 싶습니다. Linux에서 Windows가 작성한 파일을 읽을 때 또는 그 반대로 st_ctime다르게 사용하는 경우 vica가 어떻게되는지 알고 싶습니다 .
"w"이 바뀌지 않고 기존 파일이 열리고 잘립니다. 파일 내용이 파일을 만들 때의 내용과 완전히 관련이 없지만 현재 버전보다 훨씬 앞서 파일이 "만들 렸다"는 메시지가 표시됩니다. 반대로, 원자 파일을 저장할 때 원자 바꾸기를 사용하는 편집기 (원본 파일은 새로운 진행중인 작업 임시 파일로 대체 됨)는 한 문자 만 삭제하더라도 최근 생성 날짜를 표시합니다. 수정 시간을 사용하고 생성 시간을 애무하지 마십시오.
stat.st_ctime많은 경우, 마지막 메타 데이터 변경 시간이 생성 시간이 될 수 있기 때문에 ( 리눅스에서) 반환하는 것이 더 적절 합니다 (적어도 ctime실제 생성 시간 보다 mtime). 따라서 스 니펫을로 간단히 바꿀 수 있습니다 stat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime. 어떻게 생각해? 건배
ctime항상 또는 동일해야 나중에 보다 mtime때문에, mtime변화 의 원인ctime 합니다 (때문에 변화 mtime자체가 "메타 데이터"로 간주됩니다). stackoverflow.com/a/39521489/1709587을 참조하십시오 .
몇 가지 선택이 있습니다. 우선, os.path.getmtime및 os.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에게 감사드립니다)
ctime (가)마다 업데이트되는 mtime합니다 (이후 않습니다 mtime"메타 데이터"입니다), 그리고 그래서 ctime일반적으로 항상 동일 또는 앞으로의mtime . ctime"창조 된"시간으로 취급하는 것은 전혀 의미가 없습니다. -1!
Last modified: Fri Jan 31 11:08:13 2020그리고 Created: Fri Jan 31 11:08:13 2020Linux Ubuntu 16.04에서!
time.ctime(os.path.getmtime(file))파일이 시스템 또는 사용자에 의해 수정되었는지 여부에 따라 2 가지 유형의 문자열 을 반환 한다는 것을 알았습니다 . 시스템에 의해 수정 된 경우 문자열에는 월과 일 사이에 2 개의 공백이 있습니다. 이유를 모르겠습니다
이를 위해 사용하는 가장 좋은 함수는 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)
getmtime은 Unix에서 사용할 수있는 가장 가까운 것입니다 (생성 날짜를 얻을 수없는 경우) .Windows에서 사용하는 가장 좋은 기능은 아닙니다 ctime. 생성 시간입니다.
os.stat https://docs.python.org/2/library/stat.html#module-stat
편집 : 최신 코드에서는 os.path.getmtime () (Christian Oudard 덕분에 )을 사용해야
하지만 소수점 이하의 시간으로 time_t의 부동 소수점 값을 반환합니다 (OS가 지원하는 경우)
os.path.getmtime()는 파이썬 1.5.2 ( 오래된 문서 참조 ) 이후로 사용되었으며, 대부분의 아기 치아를 잃기 전에 출시되었으며 거의 10 년 전에이 답변의 원본을 작성했습니다.
os.path.getmtime () 또는 os.stat () 모드 시간을 가져 오는 두 가지 방법이 있지만 ctime은 플랫폼 간 신뢰할 수 없습니다 (아래 참조).
getmtime ( path ) 경로
를 마지막으로 수정 한 시간을 반환합니다. 반환 값은 신기원 이후의 초 수를 나타내는 숫자입니다 (시간 모듈 참조). 파일이 없거나 액세스 할 수없는 경우 os.error를 발생 시키십시오. 버전 1.5.2의 새로운 기능 버전 2.3으로 변경 : os.stat_float_times ()가 True를 반환하면 결과는 부동 소수점 숫자입니다.
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을 가져옵니다.
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 모듈에 대한 더 유용한 정보와 예제가 있습니다.
os.statst_mtime및 st_ctime속성을 가진 명명 된 튜플을 반환 합니다. 수정 시간은 st_mtime두 플랫폼 모두에 있습니다. 불행히도 Windows에서는 ctime"생성 시간"을 의미하고 POSIX에서는 "변경 시간"을 의미합니다. POSIX 플랫폼에서 생성 시간을 얻는 방법을 모르겠습니다.
dir(..). 예 :dir(os.stat(os.listdir('.')[0]))
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
다음과 같은 기호 링크가 중요하지 않은 경우 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
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
debugfs정의상 불안정하고 모든 것에 대한 최상위 루트 액세스가 필요한 리눅스에서 사용 하며 거의 모든면에서 어머니가 항상 경고하는 것들 중 하나 인 경향이있다. (그렇습니다. 보안 부팅이 필요없는 시스템에서 정말로 절망적이며 실제 수퍼 유저 인 경우에는 가능합니다.)
os.stat생성 시간은 포함되지 않습니다. os.stat()시간을 포함하는 요소에 대한 st_anything 정의는 없습니다 .
따라서 이것을 시도하십시오 :
os.stat('feedparser.py')[8]
ls -lah의 파일에서 생성 날짜와 비교하십시오.
그들은 같아야합니다.
시스템의 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 변경 시간이 아님).