আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা ফাইল তৈরি এবং পরিবর্তনের তারিখের উপর ভিত্তি করে কিছু স্টাফ করা দরকার তবে লিনাক্স এবং উইন্ডোজে চালাতে হবে ।
সেরা কি ক্রস-প্ল্যাটফর্ম উপায় ফাইল সৃষ্টি ও পরিমার্জন পেতে date/times
মধ্যে পাইথন ?
আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা ফাইল তৈরি এবং পরিবর্তনের তারিখের উপর ভিত্তি করে কিছু স্টাফ করা দরকার তবে লিনাক্স এবং উইন্ডোজে চালাতে হবে ।
সেরা কি ক্রস-প্ল্যাটফর্ম উপায় ফাইল সৃষ্টি ও পরিমার্জন পেতে date/times
মধ্যে পাইথন ?
উত্তর:
ক্রস-প্ল্যাটফর্মের উপায়ে কিছু ধরণের পরিবর্তনের তারিখ পাওয়া সহজ - কেবল কল করুন এবং আপনি যখন ফাইলটি সর্বশেষ সংশোধন করেছিলেন তখন ইউনিক্স টাইমস্ট্যাম্পটি পাবেন ।os.path.getmtime(path)
path
অন্যদিকে ফাইল তৈরির তারিখগুলি পাওয়া খুব কম এবং প্ল্যাটফর্ম নির্ভর, তিনটি বড় ওএসের মধ্যেও পৃথক:
ctime
(এ নথিভুক্ত https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) তার তৈরির তারিখ সঞ্চয় করে। আপনি পাইথনে এটিতে os.path.getctime()
বা .st_ctime
কল করার ফলাফলের বৈশিষ্ট্যটির মাধ্যমে অ্যাক্সেস করতে পারেন os.stat()
। এটি ইউনিক্সে কাজ করবে না , যেখানে ctime
শেষবারের মতো এই ফাইলটির বৈশিষ্ট্য বা বিষয়বস্তু পরিবর্তন করা হয়েছিল ।.st_birthtime
একটি কল ফল অ্যাট্রিবিউট os.stat()
।উপর লিনাক্স , এই পাইথন একটি সি এক্সটেনশন লেখা ছাড়া বর্তমানে অসম্ভব, অন্তত। যদিও লিনাক্সের সাথে সাধারণত ব্যবহৃত কিছু ফাইল সিস্টেমগুলি তৈরির তারিখগুলি সংরক্ষণ করে (উদাহরণস্বরূপ, ext4
এগুলিতে সংরক্ষণ করে st_crtime
), লিনাক্স কার্নেল তাদের অ্যাক্সেসের কোনও উপায় সরবরাহ করে না ; বিশেষত, সর্বাধিক stat()
কার্নেল সংস্করণ হিসাবে সিটিতে কলগুলি থেকে যে স্ট্রাক্টগুলি ফিরে আসে তাতে কোনও তৈরি তারিখের ক্ষেত্র নেই । আপনি দেখতে পাবেন যে সনাক্তকারীটি st_crtime
বর্তমানে পাইথন উত্সের কোথাও উপস্থিত হয় না । অন্তত যদি আপনি আছেন ext4
, ডাটা হয় ফাইল সিস্টেমের মধ্যে inodes সংযুক্ত, কিন্তু এটা ব্যবহার করার কোন সুবিধাজনক উপায়।
লিনাক্সের পরবর্তী সর্বোত্তম জিনিসটি হ'ল ফাইলটির অ্যাক্সেস করা 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
লিনাক্সের অধীনে ড্রাইভে এই ডেটা অ্যাক্সেসের একটি উপায় তৈরি করতে চাই এবং লিনাক্স যখন উইন্ডো দ্বারা লিখিত ফাইলগুলি পড়বে বা তার বিপরীতে, অন্যটি ব্যবহার করার পরে কী ঘটবে তা শিখতে চাই st_ctime
।
"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()
করে না , বরং শেষ বারের সময় ইনোডের ডেটা পরিবর্তন হয়েছিল। (একটি আকর্ষণীয় ব্লগ পোস্টের লিঙ্ক সরবরাহ করে মন্তব্যে সেই সত্যটি আরও স্পষ্ট করার জন্য কোজিরোকে ধন্যবাদ)
ctime
আপডেট যখনই mtime
করে (যেহেতু mtime
"মেটাডেটা"), এবং তাই ctime
সাধারণত হয় সর্বদা সমান বা এগিয়েmtime
। ctime
এইভাবে "তৈরি" সময় হিসাবে আচরণ করা মোটেই কোনও অর্থবোধ করে না। -1!
Last modified: Fri Jan 31 11:08:13 2020
এবং Created: Fri Jan 31 11:08:13 2020
লিনাক্স উবুন্টু 16.04 এ!
time.ctime(os.path.getmtime(file))
সিস্টেমটি বা ব্যবহারকারীর দ্বারা ফাইলটি সংশোধিত হয়েছে কিনা তা নির্ভর করে 2 প্রকারের স্ট্রিং প্রদান করে। যদি এটি সিস্টেম দ্বারা সংশোধিত করা হয় তবে স্ট্রিংটিতে মাস এবং দিনের মধ্যে 2 স্পেস থাকবে। আমি জানি না কেন
এটির জন্য ব্যবহারের সেরা ফাংশন হ'ল os.path.getmtime () । অভ্যন্তরীণভাবে, এটি কেবল ব্যবহার করে os.stat(filename).st_mtime
।
ডেটটাইম মডিউল হ'ল সেরা টাইমস্ট্যাম্পগুলি পরিচালনা করে, যাতে আপনি 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
ইউনিক্সে পাওয়া সবচেয়ে নিকটতম জিনিস (যেখানে তৈরির তারিখগুলি পাওয়া সম্ভব নয়) তবে উইন্ডোজে ব্যবহারের জন্য এটি সর্বোত্তম ফাংশন নয়, যেখানে ctime
তৈরির সময়।
os.stat https://docs.python.org/2/library/stat.html#module-stat
সম্পাদনা করুন: নতুন কোডে আপনার সম্ভবত os.path.getmtime () (ধন্যবাদ ক্রিশ্চিয়ান ওডার্ড) ব্যবহার করা উচিত
তবে নোট করুন যে এটি ভগ্নাংশের সেকেন্ডের সাথে সময়_t এর একটি ভাসমান পয়েন্ট মান প্রদান করে (যদি আপনার ওএস এটি সমর্থন করে)
os.path.getmtime()
পাইথন ২.০.২. এর পরে প্রায় ছিল ( পুরানো ডক্সগুলি দেখুন ), আমি প্রকাশিত হয়েছি আমার সন্তানের বেশিরভাগ দাঁত হারানোর আগে এবং আপনি এই উত্তরের মূল সংস্করণটি লেখার প্রায় এক দশক আগে।
মোড সময় পাওয়ার জন্য দুটি পদ্ধতি রয়েছে, os.path.getmtime () বা os.stat (), তবে সিটিটাইম নির্ভরযোগ্য ক্রস-প্ল্যাটফর্ম নয় (নীচে দেখুন)।
getmtime ( পাথ ) পাথের
শেষ পরিবর্তনের সময়টি ফিরে আসুন। প্রত্যাবর্তনের মান হ'ল একটি সংখ্যা যা যুগের পর থেকে সেকেন্ডের সংখ্যা দেয় (সময় মডিউলটি দেখুন)। ফাইলটি উপস্থিত না থাকলে বা অ্যাক্সেসযোগ্য হলে ওএসআরআর বাড়ান। 1.5.0 সংস্করণে নতুন। সংস্করণ ২.৩ এ পরিবর্তিত হয়েছে: যদি os.stat_float_times () সত্য করে দেয় তবে ফলাফলটি ভাসমান পয়েন্ট সংখ্যা number
স্টেট ( পাথ )
প্রদত্ত পথে একটি স্ট্যাট () সিস্টেম কল করুন। প্রত্যাবর্তন মান হ'ল একটি অবজেক্ট যার বৈশিষ্ট্যগুলি স্ট্যাট কাঠামোর সদস্যদের সাথে সম্পর্কিত, যেমন: st_mode (সুরক্ষা বিট), st_ino (ইনোড নম্বর), st_dev (ডিভাইস), st_nlink (হার্ড লিঙ্কের সংখ্যা), st_uid (মালিকের ব্যবহারকারীর আইডি) ), st_gid (মালিকের গ্রুপ আইডি), st_size (ফাইলের আকার, বাইটে), st_atime (অতি সাম্প্রতিক অ্যাক্সেসের সময় ), st_mটাইম (অতি সাম্প্রতিক সামগ্রী পরিবর্তনের সময়), st_cime (প্ল্যাটফর্ম নির্ভর; সর্বশেষ সাম্প্রতিক মেটাডেটা পরিবর্তনের সময়) ইউনিক্সে, বা উইন্ডোজে তৈরির সময়) :
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>>
উপরের উদাহরণে আপনি যথাক্রমে এমটাইম এবং সিটিআইএম পেতে স্ট্যাটিনফো.স্ট_মিটাইম বা স্ট্যাটিনফো.স্ট_সিটাইম ব্যবহার করবেন।
পাইথন ৩.৪ এবং এর উপরে, আপনি অবজেক্ট ওরিয়েন্টেড প্যাথলিব মডিউল ইন্টারফেসটি ব্যবহার করতে পারেন যা বেশিরভাগ ওএস মডিউলের জন্য মোড়ক অন্তর্ভুক্ত করে। ফাইলের পরিসংখ্যান পাওয়ার উদাহরণ এখানে।
>>> 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)
আপনি যদি উইন্ডোজটিতে তৈরির সময় বা ইউনিক্সের সর্বশেষতম মেটাডেটা পরিবর্তন চান তবে আপনি এটি ব্যবহার করতে পারেন fname.stat().st_ctime
:
>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
এই নিবন্ধটিতে পथলিব মডিউলের জন্য আরও সহায়ক তথ্য এবং উদাহরণ রয়েছে।
os.stat
st_mtime
এবং একটি st_ctime
বৈশিষ্ট্যযুক্ত একটি নামযুক্ত tuple প্রদান । st_mtime
উভয় প্ল্যাটফর্মে পরিবর্তনের সময় রয়েছে ; দুর্ভাগ্যক্রমে, উইন্ডোজে, এর ctime
অর্থ "সৃষ্টির সময়", যেখানে পসিক্সের অর্থ "পরিবর্তিত সময়"। আমি পসিক্স প্ল্যাটফর্মে সৃষ্টির সময় পাওয়ার কোনও উপায় সম্পর্কে অবগত নই।
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_nything এর কোনও সংজ্ঞা নেই ।
সুতরাং এটি চেষ্টা করুন:
os.stat('feedparser.py')[8]
এলএস-আল্লায় ফাইলটিতে আপনার তৈরি তারিখের সাথে এটি তুলনা করুন
তাদের একই হওয়া উচিত।
আমি সিস্টেমের স্ট্যাট কমান্ডটি চালিয়ে এবং আউটপুট পার্স করে পোস্টিক্সে সৃষ্টির সময় পেতে সক্ষম হয়েছি।
commands.getoutput('stat FILENAME').split('\"')[7]
টার্মিনাল (ওএস এক্স) থেকে পাইথনের বাইরের স্ট্যাটিংটি ফিরে এসেছে:
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
... যেখানে চতুর্থ তারিখের সময় হ'ল ফাইল তৈরি (সিটিটাইমের পরিবর্তনের পরিবর্তে অন্যান্য মন্তব্য উল্লিখিত হিসাবে))