파일 생성 및 수정 날짜를 기준으로 몇 가지 작업을 수행해야하지만 Linux 및 Windows 에서 실행 해야하는 스크립트가 있습니다.
파이썬 에서 파일 생성 및 수정을 얻는 가장 좋은 크로스 플랫폼 방법 은 무엇입니까 ?date/times
답변
크로스 플랫폼 방식으로 일종의 수정 날짜를 얻는 것은 쉽습니다. 전화 하면 파일 이 마지막으로 수정 된 시점의 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 소스의 어느 곳에도 포함되어 있지 않음을 알 수 있습니다 . 적어도 onext4
인 경우 데이터 는 파일 시스템의 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
답변
몇 가지 선택이 있습니다. 우선, 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에게 감사드립니다)
답변
이를 위해 사용하는 가장 좋은 함수는 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)
답변
os.stat https://docs.python.org/2/library/stat.html#module-stat
편집 : 최신 코드에서는 os.path.getmtime () (Christian Oudard 덕분에 )을 사용해야
하지만 소수점 이하의 시간으로 time_t의 부동 소수점 값을 반환합니다 (OS가 지원하는 경우)
답변
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을 가져옵니다.
답변
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 플랫폼에서 생성 시간을 얻는 방법을 모르겠습니다.