কিভাবে একটি ফাইল সরানো?


907

আমি পাইথন osইন্টারফেসটি দেখেছি , তবে একটি ফাইল স্থানান্তরিত করার কোনও পদ্ধতি সনাক্ত করতে অক্ষম। $ mv ...পাইথনের সমতুল্য আমি কীভাবে করব ?

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder

1
আপনারা যারা gnu-coreutils ' mvকমান্ডের সাথে পরিচিত, তাদের জন্য পাইথনের shutil.moveএকটি প্রান্তের কেস রয়েছে যেখানে shutil.moveফাংশন আলাদা হয়। সম্পূর্ণ লেখার জন্য এখানে যানসংক্ষেপে, shutil.moveপাইথনগুলি একটি ব্যতিক্রম উত্থাপন করবে (তবে gnu-coreutils তা mvকরবে না) যখন আপনার গন্তব্য ডিরেক্টরি হয় এবং ডিরেক্টরিতে ইতিমধ্যে উত্স হিসাবে একই নামের একটি ফাইল থাকে (আরও তথ্যের জন্য পূর্ববর্তী বাক্যে প্রদত্ত লিঙ্কটি দেখুন )।
ট্রেভর বয়েড স্মিথ

3
কীভাবে os.system("mv file1 file2")?
জন স্ট্রুড

উত্তর:


1336

os.rename(), shutil.move()বাos.replace()

সবাই একই বাক্য গঠন ব্যবহার করে:

import os
import shutil

os.rename("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
os.replace("path/to/current/file.foo", "path/to/new/destination/for/file.foo")

নোট করুন যে আপনি অবশ্যই file.fooউত্স এবং গন্তব্য যুক্তি উভয় ক্ষেত্রে ফাইলের নাম ( ) অন্তর্ভুক্ত করবেন । যদি এটি পরিবর্তন করা হয় তবে ফাইলটি নতুন নামকরণের পাশাপাশি সরানো হবে।

আরও লক্ষ করুন যে প্রথম দুটি ক্ষেত্রে নতুন ফাইলটি তৈরি করা হচ্ছে সেই ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকতে হবে। উইন্ডোজে, সেই নামযুক্ত কোনও ফাইল অবশ্যই উপস্থিত থাকতে পারে না বা একটি ব্যতিক্রম উত্থাপন করা os.replace()হবে , তবে চুপচাপ সেই ফাইলের উপস্থিতিতেও একটি ফাইল প্রতিস্থাপন করবে।

অন্যান্য উত্তরের মন্তব্যে যেমন উল্লেখ করা হয়েছে, বেশিরভাগ ক্ষেত্রে shutil.moveকেবল কল calls os.renameতবে গন্তব্যটি যদি উত্সের চেয়ে আলাদা ডিস্কে থাকে তবে এটি পরিবর্তে উত্স ফাইলটি অনুলিপি করে মুছে ফেলবে।


8
আমি কি কেবল একমাত্র মনে করি যে os.rename ডিরেক্টরিগুলির জন্য কাজ করছেন না? আমি উদ্ধৃতি দিয়েছি: "ডিএসটি যদি ডিরেক্টরি হয় তবে ওএসররার উত্থাপিত হবে।"
ফ্যাবিয়ান

33
shutil.moveডিরেক্টরি জন্য কাজ করে। আপনি আপেক্ষিক পাথ shutil.move(f.name, "tmp/")বা পুরো পাথ ব্যবহার করতে পারেন shutil.move(f.name, "/Users/hello/tmp/"), পাথ ব্যবহার করবেন না ~ , পাইথন ২..7.৯, ম্যাক ওএস এক্স-এ চেক করা হয়েছে
হোয়াইসইউং

3
~এটি একটি শেল কনস্ট্রাক্ট, এবং প্রতি সেপ্টেম্বর ফাইল পাথের সাথে কিছুই করার নেই, একটি ভুল জায়গায় স্থান দেওয়া কনভেনশন হিসাবে। আপনি যদি সত্যই আপনার হোম ডিরেক্টরি জড়িত করতে চান তবে os.getenv('HOME')পরিবর্তে এটি ব্যবহার করুন, যদি প্রয়োজন হয় তবে এটি আপনার কাঙ্ক্ষিত পাথের অংশগুলির সাথে যুক্ত করুন।
amn

15
আপনি সর্বদা ওএস-নির্দিষ্ট বিধি অনুসারে os.path.expanduser()' ~' 'যথাযথভাবে প্রসারিত করতে ব্যবহার করতে পারেন । %HOME%উইন্ডোতে সর্বদা সেট না থাকা থেকে অনেক বেশি পরিষ্কার ।
ig0774

14
os.renameবিভিন্ন ডিভাইস জুড়ে ফাইল পরিচালনা করবে না। shutil.moveযদি আপনি নিশ্চিত না হন যে উত্স এবং গন্তব্য ফাইল একই ডিভাইসে রয়েছে Use
জিউস্পেপ স্ক্রিভানো

243

যদিও os.rename()এবং shutil.move()উভয়ই ফাইলের নাম পরিবর্তন করে দেবে, ইউনিক্স এমভি কমান্ডের নিকটে অবস্থিত কমান্ডটি shutil.move()। পার্থক্যটি হ'ল os.rename()উত্স এবং গন্তব্যটি বিভিন্ন ডিস্কে থাকা অবস্থায় কাজ shutil.move()করে না , তবে ফাইলগুলি কী ডিস্কে রয়েছে তা যত্ন করে না।


75
shutil.move()os.rename()গন্তব্য যদি বর্তমান ফাইল সিস্টেমে থাকে তবে ব্যবহার করে। অন্যথায়, shutil.move()উত্সটি ব্যবহার করে গন্তব্যটিতে অনুলিপি করে উত্সটি shutil.copy2()সরিয়ে দেয়।
লাইন বিরতি

8
shutil.copy2()সমস্ত ফাইলের মেটাডেটা অনুলিপি করতে পারে না তা অনুধাবন করার জন্য যত্ন নিন , সুতরাং যদি এটি ঘটে তবে এটি করার মতো cp -pএবং তারপরে rm, আমি সংগ্রহ করি।
2rs2ts

9
সচেতন থাকুন: গন্তব্য ইতিমধ্যে বিদ্যমান থাকলে পাইথন ২.7.৩ এ shutil.move ব্যর্থ হয়। সুতরাং যদি এটি সম্ভব হয়, হয় ত্রুটিটি ধরুন, বা ম্যানুয়ালি ফাইল / ডির সরিয়ে ফেলুন, তারপরে সরান।
ডানা

36

Os.rename বা shutil.move উভয়ের জন্য আপনাকে মডিউলটি আমদানি করতে হবে। সমস্ত ফাইল সরিয়ে নিতে কোনও * অক্ষর প্রয়োজন হয় না।

আমাদের কাছে ফোল্ডার রয়েছে / অপ্ট / দুর্দান্ত নামক উত্স যার নামে দুর্দান্ত এক ফাইল রয়েছে ভয়ঙ্কর t টেক্সট।

in /opt/awesome
  ls
source
  ls source
awesome.txt

python 
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']

ফোল্ডারের নাম বাস্তবে পরিবর্তিত হয়েছে তা দেখতে আমরা os.listdir ব্যবহার করেছি। এখানে শুটিল গন্তব্যটিকে উত্সটিতে ফিরিয়ে আনছে।

>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']

এবার আমি উত্স ফোল্ডারের ভিতরে যাচাই করেছিলাম নিশ্চিত হয়েছি যে আমার তৈরি করা দুর্দান্ত esome টেক্সট ফাইলটি বিদ্যমান। এটা সেখানে :)

এখন আমরা একটি উত্স থেকে কোনও ফোল্ডার এবং এর ফাইলগুলি একটি গন্তব্যে নিয়ে গিয়েছি এবং আবার ফিরে এসেছি।


4
docs.python.org/2/library/shutil.html এই ডকুমেন্টেশনটি দেখায় যে আপনি আপনার পরামিতিগুলি shutil.move পদ্ধতির জন্য স্যুইচ করেছেন।
mac10688

1
আমি গন্তব্য এবং উত্সটি বিপরীতভাবে ব্যবহার করে দেখলাম যে ফাইলগুলি উত্স থেকে সরানো হয়েছে এবং তারপরে আবার ফিরে এসেছি .... আমি দেখতে পেলাম কীভাবে এটি অস্পষ্ট।
jmontross

34

পাইথন 3.4 পরে, আপনি এছাড়াও ব্যবহার করতে পারেন pathlib'র বর্গ Pathপদক্ষেপ ফাইলে।

from pathlib import Path

Path("path/to/current/file.foo").rename("path/to/new/destination/for/file.foo")

https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename


2
"পাথলিব আমদানি পথ থেকে" আমদানি করতে চমৎকার কাজ করে :)
তৌহিদ

14

এই মুহুর্তে আমি এটি ব্যবহার করছি:

import os, shutil
path = "/volume1/Users/Transfer/"
moveto = "/volume1/Users/Drive_Transfer/"
files = os.listdir(path)
files.sort()
for f in files:
    src = path+f
    dst = moveto+f
    shutil.move(src,dst)

এখন সম্পূর্ণ কার্যকর। আশা করি এটি আপনাকে সহায়তা করবে।

সম্পাদনা:

আমি এটিকে একটি ফাংশনে পরিণত করেছি, যা উত্স এবং গন্তব্য ডিরেক্টরিটি গ্রহণ করে, গন্তব্য ফোল্ডারটি উপস্থিত না থাকলে তা তৈরি করে এবং ফাইলগুলি সরিয়ে দেয়। এছাড়াও এসসিআর ফাইলগুলি ফিল্টার করার অনুমতি দেয়, উদাহরণস্বরূপ যদি আপনি কেবল চিত্রগুলি সরিয়ে নিতে চান, তবে আপনি '*.jpg'ডিফল্টরূপে প্যাটার্নটি ব্যবহার করেন , এটি ডিরেক্টরিতে সমস্ত কিছু সরিয়ে দেয়

import os, shutil, pathlib, fnmatch

def move_dir(src: str, dst: str, pattern: str = '*'):
    if not os.path.isdir(dst):
        pathlib.Path(dst).mkdir(parents=True, exist_ok=True)
    for f in fnmatch.filter(os.listdir(src), pattern):
        shutil.move(os.path.join(src, f), os.path.join(dst, f))

1
আপনি সহজেই fnmatch.filter () ব্যবহার করে এটিকে ফিল্টার পদক্ষেপে পরিণত করতে পারেন, আমার সম্পাদনা দেখুন। এছাড়াও, os.path.join(parent_path, filename)ক্রস-প্ল্যাটফর্ম সমস্যাগুলি এড়াতে স্ট্রিং
কনটেনটেশনের

11

গৃহীত উত্তরটি সঠিক নয়, কারণ প্রশ্নটি কোনও ফাইলের নাম পরিবর্তন করে কোনও ফাইলকে নয়, তবে অনেকগুলি ফাইলকে ডিরেক্টরিতে স্থানান্তরিত করার বিষয়ে। shutil.moveকাজটি করবে, তবে এই উদ্দেশ্যে os.renameঅকেজো (মন্তব্যগুলিতে বর্ণিত) কারণ গন্তব্যের অবশ্যই একটি স্পষ্ট ফাইলের নাম থাকতে হবে।


অকেজো নয়, একাধিক ফাইল সরানোর জন্য আরও কাজ প্রয়োজন। আপনি ফাইল ফাইল os.path.basename(my_file_path)এবং এর সাথে ফাইল ডিরেক্টরি পেতে পারেন os.path.dirname(my_file_path)। অধিকন্তু, ওপি যদি এটি একাধিক ফাইল সরিয়ে নিতে চায় তবে খুব একটা পরিষ্কার করা যায় নি। তিনি প্রশ্নের মধ্যে কেবল একটি ফাইল সরানোর উল্লেখ করেছিলেন, তবে তার উদাহরণ কোডটিতে একাধিক ফাইল সরিয়ে নেওয়া বোঝানো হয়েছে।
জ্যাক ম্যাথিউ

2

এখানে বর্ণিত উত্তরের ভিত্তিতে ব্যবহার subprocessকরা অন্য বিকল্প।

এটার মতো কিছু:

subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)

আমি তুলনায় এই পদ্ধতির প্রো এবং কনসের সাথে জানতে আগ্রহী shutil। যেহেতু আমার ক্ষেত্রে আমি ইতিমধ্যে subprocessঅন্যান্য কারণে ব্যবহার করছি এবং এটি মনে হয় আমি এটির সাথে লেগে থাকি।

এটা কি সিস্টেম নির্ভর?


2
আমি বিশ্বাস করি এটি সিস্টেম নির্ভর হবে। আমি mvউইন্ডোজ অপারেটিং সিস্টেমে সফলভাবে ব্যবহৃত হচ্ছে দেখছি না ।
জোশুয়া শ্লিচটিং

0

এটি সমাধান, যা shellব্যবহারে সক্ষম হয় না mv

import subprocess

source      = 'pathToCurrent/file.foo'
destination = 'pathToNew/file.foo'

p = subprocess.Popen(['mv', source, destination], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
res = p.communicate()[0].decode('utf-8').strip()

if p.returncode:
    print 'ERROR: ' + res

-2
  import os,shutil

  current_path = "" ## source path

  new_path = "" ## destination path

  os.chdir(current_path)

  for files in os.listdir():

        os.rename(files, new_path+'{}'.format(f))
        shutil.move(files, new_path+'{}'.format(f)) ## to move files from 

বিভিন্ন ডিস্ক প্রাক্তন সি: -> ডি:


যদি আপনি পাইথন 3 ব্যবহার করেন। # আপনি নতুন এফ-স্ট্রিং ইন্টিটারপোলেশন ব্যবহার করতে পারেন: f"{new_path}{f}"তবে আপনার স্ট্রিংটিতে আপনার কোনও স্ট্যাটিক পাঠ্য নেই, এটি আরও বেশি কাজ হতে পারে .... আমি ব্যবহার করার অভ্যাসে যাওয়ার চেষ্টা করছি যদিও এফ স্ট্রিং।
জাস্টোপি

আপনি চ এর পরিবর্তে ফাইল বোঝাতে চান?
ম্যাথু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.