답변:
크로스 플랫폼 방식으로 일종의 수정 날짜를 얻는 것은 쉽습니다. 전화 하면 파일 이 마지막으로 수정 된 시점의 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_mtime
os.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
ext4
Linux의 드라이브 에서이 데이터에 액세스하는 방법을 만들고 싶습니다. 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 2020
Linux 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.stat
st_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 변경 시간이 아님).