পাইথন ব্যবহার করে স্পর্শ প্রয়োগ করবেন?


352

touchএকটি ইউনিক্স ইউটিলিটি যা বর্তমান সময়ের জন্য ফাইলগুলির পরিবর্তন এবং অ্যাক্সেসের সময়গুলি সেট করে। যদি ফাইলটি না থাকে তবে এটি ডিফল্ট অনুমতি নিয়ে তৈরি করা হয়।

আপনি কীভাবে এটি পাইথন ফাংশন হিসাবে বাস্তবায়ন করবেন? ক্রস প্ল্যাটফর্ম এবং সম্পূর্ণ হওয়ার চেষ্টা করুন।

("পাইথন টাচ ফাইল" এর জন্য বর্তমান গুগল ফলাফলগুলি দুর্দান্ত নয়, তবে ওএস.টাইমে নির্দেশ করুন ))


4
দয়া করে এখন গৃহীত উত্তর আপডেট করার বিষয়ে বিবেচনা করুন যে এই কার্যকারিতাটি পাইথন স্টিডলিবে অন্তর্নির্মিত।
মাইলস

@ মাইলস গৃহীত উত্তরটি প্রশ্নটি যা চেয়েছিল ঠিক তাই করে - এটি আসলে একটি লাইব্রেরি ব্যবহার না করে পাইথনে ফাংশনটি বাস্তবায়িত করেছিল।
স্টাইলফোম ফ্লাইট

5
@styrofoamfly মান গ্রন্থাগার হয় পাইথন অংশ। এটি সত্যই সম্ভবত যে প্রশ্নকর্তা যা জানতে চান তা হ'ল (এবং গুগলের মাধ্যমে বেশিরভাগ লোকেরা এই প্রশ্নের touchকাছে আগত ) কীভাবে তাদের পাইথন প্রোগ্রামগুলিতে অনুরূপ কার্যকারিতা অর্জন করবেন , কীভাবে এটিকে স্ক্র্যাচ থেকে পুনরায় বাস্তবায়ন করবেন না; pathlibসমাধানগুলিতে স্ক্রোল করে এই ব্যক্তিদের সর্বোত্তমভাবে পরিবেশন করা হয় । যদিও এখন-ইন নির্মিত এই উত্তর "পাইথন স্পর্শ ফাইল" চেয়ে জন্য অনেক ভাল Google র্যাঙ্কিং হয়েছে প্রাসঙ্গিক ডকুমেন্টেশন
মাইলস

@ মাইলস পাইথন 2 টি এখনও 3 এর চেয়ে বেশি ব্যবহৃত হয়েছে, তাই আমি মনে করি গ্রহণযোগ্য উত্তরটি এখনও আরও প্রাসঙ্গিক। কিন্তু আপনার মন্তব্যটি দ্বিতীয় উত্তরের দিকে লোককে নির্দেশ করার একটি ভাল কাজ করে।
itadok

6
পাইথন 2 এই বছরের শেষে EOL E
ম্যাক্স গ্যাসনার

উত্তর:


303

ভালো দেখায় পাইথন 3.4 এর নতুন হয় - pathlib

from pathlib import Path

Path('path/to/file.txt').touch()

এটি একটি file.txtপথে তৈরি করবে ।

-

পাথ.টচ (মোড = 0o777, অস্তিত্ব_োক = সত্য)

এই প্রদত্ত পথে একটি ফাইল তৈরি করুন। যদি মোড দেওয়া হয় তবে এটি ফাইল মোড নির্ধারণ এবং পতাকা অ্যাক্সেসের জন্য প্রক্রিয়াটির umask মানটির সাথে মিলিত হয়। যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে তবে অস্তিত্ব_োক সত্য হলে ফাংশনটি সফল হয় (এবং এটির পরিবর্তনের সময়টি বর্তমান সময়ে আপডেট করা হয়), অন্যথায় ফাইলএক্সিস্টস এরির উত্থাপিত হয়।


3
পাইথন 2.7 এ:pip install pathlib
আন্দ্রে

7
স্বরে নোট করুন: Path('/some/path').mkdir()যদি ফাইলটি সম্পাদনা করতে হবে এমন ডিরেক্টরি touch()উপস্থিত না থাকলে ব্যবহার করুন।
জ্যাকবআইআরআর

1
আমি মনে করি এর pathlib2পরিবর্তে আমাদের ব্যবহার করা উচিত pathlibকারণ pathlibএখন কেবল বাগফিক্স। অতএব, পাইথন ২.7 এ: pip install pathlib2এবং তারপরে from pathlib2 import Path
ইয়ান লিন

@ আইলিন স্ট্যান্ডার্ড লাইব্রেরি ইতিমধ্যে সমর্থন করে এমন কিছু করার জন্য একটি লাইব্রেরি ইনস্টল করার সামান্য কারণ রয়েছে। আপনি কি বিট বিটকেট.আর.পিট্রো / প্যাথলিব / এসসিআর / ডিফল্টকে ডকস.পিথন.আর.ইথ / লাইব্রেরি / পাথলিব এইচটিএমএল দিয়ে বিভ্রান্ত করছেন ?
মাইকেল মরোজেক

এই মন্তব্যটি পাইথন ২.7 সম্পর্কে কথা বলে আন্দ্রেদের মন্তব্যের জবাব দিচ্ছে, যার কোনও মানক গ্রন্থাগার নেই। পিপিআই.আর.
ইয়ান লিন

242

এটি অন্যান্য সমাধানগুলির চেয়ে কিছুটা রেস-মুক্ত থাকার চেষ্টা করে। ( withপাইথন 2.5 তে কিওয়ার্ডটি নতুন।

import os
def touch(fname, times=None):
    with open(fname, 'a'):
        os.utime(fname, times)

মোটামুটি এর সমতুল্য।

import os
def touch(fname, times=None):
    fhandle = open(fname, 'a')
    try:
        os.utime(fname, times)
    finally:
        fhandle.close()

এখন, এটিকে সত্যই রেস-মুক্ত করার জন্য futimesআপনার ফাইলটি খোলার পরিবর্তে ওপেন ফাইলহ্যান্ডেলের টাইমস্ট্যাম্পটি ব্যবহার করতে হবে এবং তারপরে ফাইলের নাম (যা হয়ত নামকরণ করা হয়েছে) টাইমস্ট্যাম্প পরিবর্তন করতে হবে। দুর্ভাগ্যবশত, পাইথন কল করার কোনো সুবিধা প্রদান বলে মনে হচ্ছে না futimesমাধ্যমে যাওয়া ছাড়া ctypesবা অনুরূপ ...


সম্পাদনা

নেট পার্সনস দ্বারা উল্লিখিত হিসাবে , পাইথন ৩.৩ ফাংশনগুলিতে একটি ফাইল বর্ণনাকারী (কখন ) নির্দিষ্ট করে যোগ করবে , যা হুডের নীচে সিস্কলের পরিবর্তে সিস্কল ব্যবহার করবে । অন্য কথায়:os.supports_fdos.utimefutimesutimes

import os
def touch(fname, mode=0o666, dir_fd=None, **kwargs):
    flags = os.O_CREAT | os.O_APPEND
    with os.fdopen(os.open(fname, flags=flags, mode=mode, dir_fd=dir_fd)) as f:
        os.utime(f.fileno() if os.utime in os.supports_fd else fname,
            dir_fd=None if os.supports_fd else dir_fd, **kwargs)

এটি হ'ল আসল সমাধান - এবং ফুিউটাইম () উপলব্ধ না হলে কোর্টিলগুলিতে স্পর্শ (1) এটি করে does ফুটাইমস কোনও পোর্টেবল ফাংশন নয় এবং এটি পুরানো ২.6 লিনাক্স কার্নেলগুলিতেও বিদ্যমান নেই, সুতরাং আপনাকে ENOSYS এর সাথে ডিল করতে হবে এবং আপনি এটি ব্যবহার না করেও ইউটিমে ফিরে যেতে হবে।
গ্লেন মেইনার্ড

(উপরের প্রুফ্রেডিং ত্রুটি: "এটি" = খোলা ("ক") + ফুটাইমস।) ভাগ্যক্রমে, এমন কোনও ক্ষেত্রে ভাবতে অসুবিধা হয় যেখানে ফুটাইমস ব্যবহার না করার দৌড় পরিস্থিতি আসলেই গুরুত্বপূর্ণ। আপনি যে "ভুল" কেসটি শেষ করতে পারেন তা হ'ল ফাইলটির নাম ওপেন () এবং ইউটাইম () এর মধ্যে করা হচ্ছে, সেক্ষেত্রে আপনি কোনও নতুন ফাইল তৈরি করবেন না বা পুরানোটিকে স্পর্শ করবেন না। এটি গুরুত্বপূর্ণ হতে পারে, তবে বেশিরভাগ সময় তা হবে না।
গ্লেন মেইনার্ড

সাইগউইন স্পর্শ কেবল পঠনযোগ্য ফাইলগুলিতে তার যাদু করতে পারে তবে এই কোডটি তা করতে পারে না। (চেক e.errno) os.utime (ফাইলের নাম, বার): তবে এটি কাজ বলে মনে হয় যদি আমি এটা চেষ্টা সঙ্গে ঘিরে: <কোড> IOError ব্যতীত ই যেমন
ড্যাশ-হুলো ঠুং

এফওয়াইআই, দেখে মনে হচ্ছে ফিউটাইমগুলি যোগ করা হয়েছে 3.3
পার্সনস

দ্রষ্টব্য: বিল্ট-ইন fileফাংশনটি পাইথন 3 থেকে সরানো হয়েছিল এবং openপরিবর্তে এটি ব্যবহার করতে হবে। আমি পুরোপুরি এটি মিস করেছি কারণ আমি যে সম্পাদকের (জিডিট) ব্যবহার করছি তার সিনট্যাক্স হাইলাইটিংটি এখনও পাইথন ২ টার্গেট করছে
বার্ট

42
def touch(fname):
    if os.path.exists(fname):
        os.utime(fname, None)
    else:
        open(fname, 'a').close()

24
এই সমাধানটিতে একটি সম্ভাব্য রেসের শর্ত রয়েছে: যদি ফাইলটি উপস্থিত না থাকে এবং এই ফাংশনটি open()কলটি পৌঁছানোর আগেই অন্য কোনও প্রক্রিয়া দ্বারা তৈরি করা হয় , তবে ফাইলের বিষয়বস্তুগুলি কেটে যাবে। 'a'পরিবর্তে মোড ব্যবহার করার পরামর্শ দিন।
গ্রেগ হিউগিল

7
একমত। যথাযথ সমাধানটি কেবল: ডিএফ টাচ (নাম): খোলা (নাম, 'ওয়া')। বন্ধ ()
স্টেপেনচেগ

@ গ্রেগ, যদিও এটি সম্ভাব্য রেসিং শর্ত সম্পর্কিত সমস্যার সমাধান করে, এক সময়ের open(fname, 'a').close()পরিবর্তন করবে না।
সাইলেন্টগোস্ট

@ সাইলেন্টগোস্ট: এটি সত্য, তবে এটি ঠিক আছে কারণ যদি ফাইলটি উপস্থিত থাকে তবে এটি কেবল তৈরি হয়েছিল । অবশ্যই আপনি os.utime()পূর্ব-বিদ্যমান ফাইলগুলির জন্য কলটি সেখানে রেখে দেবেন ।
গ্রেগ হিউগিল

4
এটির উপস্থিতি নিশ্চিত করার জন্য কেন কেবল খোলেন না, তারপরে ইউটিমে ফোন করবেন?
itadok

31

কেন এটি চেষ্টা করবেন না ?:

import os

def touch(fname):
    try:
        os.utime(fname, None)
    except OSError:
        open(fname, 'a').close()

আমি বিশ্বাস করি এটি গুরুত্বপূর্ণ যে কোনও রেসের শর্তকে দূর করে। যদি ফাইলটি না থাকে তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

এখানে কেবলমাত্র সম্ভাব্য রেস শর্তটি হ'ল যদি ওপেন () কল করার আগে ফাইলটি তৈরি করা হয় তবে os.utime () এর পরে। তবে এটি কোনও বিষয় নয় কারণ এই ক্ষেত্রে পরিবর্তনের সময়টি প্রত্যাশার মতো হবে কারণ স্পর্শ করার জন্য () স্পর্শ করার সময় এটি অবশ্যই ঘটেছে।


8

এখানে কিছু কোড রয়েছে যা সিটাইপগুলি ব্যবহার করে (কেবল লিনাক্সে পরীক্ষিত):

from ctypes import *
libc = CDLL("libc.so.6")

#  struct timespec {
#             time_t tv_sec;        /* seconds */
#             long   tv_nsec;       /* nanoseconds */
#         };
# int futimens(int fd, const struct timespec times[2]);

class c_timespec(Structure):
    _fields_ = [('tv_sec', c_long), ('tv_nsec', c_long)]

class c_utimbuf(Structure):
    _fields_ = [('atime', c_timespec), ('mtime', c_timespec)]

utimens = CFUNCTYPE(c_int, c_char_p, POINTER(c_utimbuf))
futimens = CFUNCTYPE(c_int, c_char_p, POINTER(c_utimbuf)) 

# from /usr/include/i386-linux-gnu/bits/stat.h
UTIME_NOW  = ((1l << 30) - 1l)
UTIME_OMIT = ((1l << 30) - 2l)
now  = c_timespec(0,UTIME_NOW)
omit = c_timespec(0,UTIME_OMIT)

# wrappers
def update_atime(fileno):
        assert(isinstance(fileno, int))
        libc.futimens(fileno, byref(c_utimbuf(now, omit)))
def update_mtime(fileno):
        assert(isinstance(fileno, int))
        libc.futimens(fileno, byref(c_utimbuf(omit, now)))

# usage example:
#
# f = open("/tmp/test")
# update_mtime(f.fileno())

8

কীওয়ার্ড withপ্রকাশিত হওয়ার পরে পাইথন -২.২ থেকে এই উত্তরটি সমস্ত সংস্করণের সাথে সামঞ্জস্যপূর্ণ ।

1. উপস্থিত না থাকলে ফাইল তৈরি করুন + বর্তমান সময় সেট করুন
(কমান্ডের মতো হ'ল touch)

import os

fname = 'directory/filename.txt'
with open(fname, 'a'):     # Create file if does not exist
    os.utime(fname, None)  # Set access/modified times to now
                           # May raise OSError if file does not exist

আরও শক্তিশালী সংস্করণ:

import os

with open(fname, 'a'):
  try:                     # Whatever if file was already existing
    os.utime(fname, None)  # => Set current time anyway
  except OSError:
    pass  # File deleted between open() and os.utime() calls

২. অস্তিত্ব না থাকলে কেবল ফাইলটি তৈরি করুন
(সময় আপডেট হয় না)

with open(fname, 'a'):  # Create file if does not exist
    pass

৩. শুধু ফাইল অ্যাক্সেস / পরিবর্তিত সময় আপডেট করুন
(বিদ্যমান না থাকলে ফাইল তৈরি করে না)

import os

try:
    os.utime(fname, None)  # Set access/modified times to now
except OSError:
    pass  # File does not exist (or no permission)

ব্যবহার করা os.path.exists()কোডটি সহজ করে না:

from __future__ import (absolute_import, division, print_function)
import os

if os.path.exists(fname):
  try:
    os.utime(fname, None)  # Set access/modified times to now
  except OSError:
    pass  # File deleted between exists() and utime() calls
          # (or no permission)

বোনাস: একটি ডিরেক্টরিতে সমস্ত ফাইলের আপডেটের সময়

from __future__ import (absolute_import, division, print_function)
import os

number_of_files = 0

#   Current directory which is "walked through"
#   |     Directories in root
#   |     |  Files in root       Working directory
#   |     |  |                     |
for root, _, filenames in os.walk('.'):
  for fname in filenames:
    pathname = os.path.join(root, fname)
    try:
      os.utime(pathname, None)  # Set access/modified times to now
      number_of_files += 1
    except OSError as why:
      print('Cannot change time of %r because %r', pathname, why)

print('Changed time of %i files', number_of_files)

4
with open(file_name,'a') as f: 
    pass

ব্যর্থ : with open(fn,'a'): passঅথবা বিকল্পটি open(fn, 'a').close()রেড হ্যাট 7 এ পাইথন 2.7.5 ব্যবহার করে পরিবর্তিত সময় পরিবর্তন করবেন না (ফাইল সিস্টেমটি এক্সএফএস)) আমার প্ল্যাটফর্মে, এই সমাধানগুলি উপস্থিত না থাকলে কেবল একটি খালি ফাইল তৈরি করে। : - /
অলিবরে

3

সরল:

def touch(fname):
    open(fname, 'a').close()
    os.utime(fname, None)
  • openনিশ্চিত সেখানে একটি ফাইল আছে
  • utimeটাইমস্ট্যাম্পগুলি আপডেট হয়েছে তা নিশ্চিত করে

তাত্ত্বিকভাবে, এটি সম্ভব যে কেউ এর পরে ফাইলটি মুছে openফেলবে, ফলে ইউটিম একটি ব্যতিক্রম বাড়িয়ে তুলবে। তবে তর্কযোগ্যভাবে এটি ঠিক আছে, যেহেতু খারাপ কিছু ঘটেছিল।


1

জটিল (সম্ভবত বগি):

def utime(fname, atime=None, mtime=None)
    if type(atime) is tuple:
        atime, mtime = atime

    if atime is None or mtime is None:
        statinfo = os.stat(fname)
        if atime is None:
            atime = statinfo.st_atime
        if mtime is None:
            mtime = statinfo.st_mtime

    os.utime(fname, (atime, mtime))


def touch(fname, atime=None, mtime=None):
    if type(atime) is tuple:
        atime, mtime = atime

    open(fname, 'a').close()
    utime(fname, atime, mtime)

এটি GNU টাচের মতো অ্যাক্সেস বা পরিবর্তনের সময় সেট করার অনুমতি দেওয়ার চেষ্টা করে।


1

পছন্দসই ভেরিয়েবলগুলির সাথে একটি স্ট্রিং তৈরি করা ও ওএস. সিস্টেমে এটি যুক্তিযুক্ত মনে হতে পারে:

touch = 'touch ' + dir + '/' + fileName
os.system(touch)

এটি বেশ কয়েকটি উপায়ে অপর্যাপ্ত (উদাহরণস্বরূপ, এটি শ্বেত স্পেস পরিচালনা করে না), তাই এটি করবেন না।

সাব-প্রসেস ব্যবহার করা আরও শক্তিশালী পদ্ধতি:

subprocess.call(['touch', os.path.join(dirname, fileName)])

যদিও এটি সাব-শেল (ওএস.সিস্টেম সহ) ব্যবহারের চেয়ে অনেক ভাল, এটি কেবলমাত্র দ্রুত এবং নোংরা স্ক্রিপ্টগুলির জন্য উপযুক্ত; ক্রস প্ল্যাটফর্ম প্রোগ্রামগুলির জন্য গৃহীত উত্তরটি ব্যবহার করুন।


এটি খুব নিরাপদ নয়: ফাইলের নামের মধ্যে একটি স্থান থাকলে কী ঘটে?
ayke

5
subprocess.call(['touch', os.path.join(dirname, fileName)])সাবসেল (সহ os.system) ব্যবহার করার চেয়ে অনেক ভাল । তবে তবুও, কেবলমাত্র দ্রুত এবং নোংরা স্ক্রিপ্টগুলির জন্য এটি ব্যবহার করুন, ক্রস প্ল্যাটফর্ম প্রোগ্রামগুলির জন্য গৃহীত উত্তরটি ব্যবহার করুন।
ayke

1
touchকোনও ক্রস-প্ল্যাটফর্ম উপলব্ধ কমান্ড নয় (উদাঃ উইন্ডোজ)
মাইক টি

1

"খুলুন (ফাইলের নাম, 'এ') close বন্ধ করুন ()" উইন্ডোজটিতে পাইথন ২.7 এ আমার পক্ষে কাজ করেনি। "os.utime (ফাইলের নাম, কিছুই নয়)" ঠিকঠাক কাজ করেছে।

এছাড়াও, আমার প্রয়োজন ছিল কোনও তারিখের চেয়ে পুরানো তারিখের সাথে ডিরেক্টরিতে সমস্ত ফাইল পুনরাবৃত্তভাবে স্পর্শ করা। আমি মহামান্য এর খুব সহায়ক প্রতিক্রিয়া উপর ভিত্তি করে hte নিম্নলিখিত তৈরি।

def touch(file_name):
    # Update the modified timestamp of a file to now.
    if not os.path.exists(file_name):
        return
    try:
        os.utime(file_name, None)
    except Exception:
        open(file_name, 'a').close()

def midas_touch(root_path, older_than=dt.now(), pattern='**', recursive=False):
    '''
    midas_touch updates the modified timestamp of a file or files in a 
                directory (folder)

    Arguements:
        root_path (str): file name or folder name of file-like object to touch
        older_than (datetime): only touch files with datetime older than this 
                   datetime
        pattern (str): filter files with this pattern (ignored if root_path is
                a single file)
        recursive (boolean): search sub-diretories (ignored if root_path is a 
                  single file)
    '''
    # if root_path NOT exist, exit
    if not os.path.exists(root_path):
        return
    # if root_path DOES exist, continue.
    else:
        # if root_path is a directory, touch all files in root_path
        if os.path.isdir(root_path):
            # get a directory list (list of files in directory)
            dir_list=find_files(root_path, pattern='**', recursive=False)
            # loop through list of files
            for f in dir_list:
                # if the file modified date is older thatn older_than, touch the file
                if dt.fromtimestamp(os.path.getmtime(f)) < older_than:
                    touch(f)
                    print "Touched ", f
        # if root_path is a file, touch the file
        else:
            # if the file modified date is older thatn older_than, touch the file
            if dt.fromtimestamp(os.path.getmtime(f)) < older_than:
                touch(root_path)

1

আপনি কেন চেষ্টা করবেন না: newfile.py

#!/usr/bin/env python
import sys
inputfile = sys.argv[1]

with open(inputfile, 'w') as file:
    pass

পাইথন newfile.py foobar.txt

অথবা

সাব-প্রসেস ব্যবহার করুন:

import subprocess
subprocess.call(["touch", "barfoo.txt"])

0

নিম্নলিখিতটি যথেষ্ট:

import os
def func(filename):
    if os.path.exists(filename):
        os.utime(filename)
    else:
        with open(filename,'a') as f:
            pass

আপনি যদি স্পর্শের জন্য একটি নির্দিষ্ট সময় নির্ধারণ করতে চান তবে নিম্নরূপে os.utime ব্যবহার করুন:

os.utime(filename,(atime,mtime))

এখানে, টাইম এবং এমটাইম উভয়ই ইন্টি / ফ্লোট হওয়া উচিত এবং আপনি যে সময়টি সেট করতে চান তার সেকেন্ডে পর্বের সমান হতে হবে।


0

আপনি যদি বাদ না দিয়ে চেষ্টা করেন তবে ...

def touch_dir(folder_path):
    try:
        os.mkdir(folder_path)
    except FileExistsError:
        pass

তবে একটি বিষয় লক্ষণীয়, যদি একই নামে কোনও ফাইল উপস্থিত থাকে তবে এটি কাজ করবে না এবং নীরবে ব্যর্থ হবে।


0

write_text()থেকে pathlib.Pathব্যবহার করা যেতে পারে।

>>> from pathlib import Path
>>> Path('aa.txt').write_text("")
0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.