ගොනුවක් ගෙන යන්නේ කෙසේද?


948

මම පයිතන් osඅතුරුමුහුණත දෙස බැලුවෙමි , නමුත් ගොනුවක් ගෙනයාමට ක්‍රමයක් සොයා ගැනීමට නොහැකි විය. $ mv ...පයිතන් වල සමාන දේ මම කරන්නේ කෙසේද ?

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

2
හුරු පුරුදු ඔබ අය සඳහා GNU-coreutils ' mvවිධාන , පිඹුරා ගේ shutil.moveඑක් මුල්ලකට නඩුව කැඳවූ අවස්ථාවේදී ඇති shutil.moveකාර්යය වඩා වෙනස්. සම්පූර්ණ ලිවීම සඳහා මෙතැනට යන්න . ඉතා කෙටියෙන් කියනවා නම්, Python හි shutil.moveව්යතිරේකයක් මතු කරනු ඇත (නමුත් GNU-coreutils mvනැහැ) ඔබගේ ගමනාන්තය නාමාවලියක් වන අතර බහලුම දැනටමත් උල්පත ලෙස එම නම ඇති ගොනුවක් ඇති විට (නැවතත් වැඩිදුර තොරතුරු සඳහා පෙර දඬුවම ඇති ලින්ක් එක බලන්න ).
ට්‍රෙවර් බොයිඩ් ස්මිත්

3
කොහොමද os.system("mv file1 file2")?
ජෝන් ස්ට්‍රූඩ්

Answers:


1413

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()එම අවස්ථාවෙහිදී පවා නිහ ly ව ගොනුවක් ප්‍රතිස්ථාපනය කරනු ඇත.

වෙනත් පිළිතුරු ගැන අදහස් සඳහන් කර ඇති පරිදි, shutil.moveහුදෙක් ඉල්ලා os.renameබොහෝ අවස්ථාවලදී. කෙසේ වෙතත්, ගමනාන්තය ප්‍රභවයට වඩා වෙනස් තැටියක තිබේ නම්, එය ඒ වෙනුවට ප්‍රභව ගොනුව පිටපත් කර මකා දමනු ඇත.


8
Os.rename නාමාවලි සඳහා ක්‍රියා නොකරයි යැයි සිතන එකම පුද්ගලයා මමද? මම උපුටා දක්වන්නෙමි: "dst ඩිරෙක්ටරියක් නම්, OSError මතු වේ."
ෆේබියන්

34
shutil.moveනාමාවලි සඳහා වැඩ කරයි. ඔබ සාපේක්ෂ මාර්ගය භාවිතා කළ හැක shutil.move(f.name, "tmp/")හෝ සම්පූර්ණ මාර්ගය shutil.move(f.name, "/Users/hello/tmp/"), භාවිත කරන්නේ නැහැ ~ මාවතේ, python2.7.9 පරීක්ෂා, මැක් OS X.
whyisyoung

3
~ෂෙල් ඉදි කිරීමක් වන අතර, අස්ථානගත වූ සම්මුතියක් හැරෙන්නට, ගොනු මාර්ග සමඟ කිසිදු සම්බන්ධයක් නැත. ඔබට සැබවින්ම ඔබගේ නිවාස නාමාවලිය සම්බන්ධ කර ගැනීමට අවශ්‍ය නම්, os.getenv('HOME')ඒ වෙනුවට භාවිතා කරන්න, අවශ්‍ය නම් එය අපේක්ෂිත මාර්ගයේ කොටස් සමඟ සංයුක්ත කරන්න.
amn

16
Os- විශේෂිත නීතිරීතිවලට අනුව os.path.expanduser()' ~' නිසි ලෙස පුළුල් කිරීමට ඔබට සැමවිටම භාවිතා කළ හැකිය . %HOME%වින්ඩෝස් මත සැමවිටම සකසා නැති බැවින් බොහෝ පිළිවෙලට .
ig0774

14
os.renameවිවිධ උපාංග හරහා ගොනු හැසිරවිය නොහැක. shutil.moveප්‍රභවය සහ ගමනාන්ත ගොනුව එකම උපාංගයක ඇති බව ඔබට විශ්වාස නැත්නම් භාවිතා කරන්න .
ගුසෙප් ස්ක්‍රිවානෝ

250

නමුත් os.rename()සහ shutil.move()ප්රතිනම්කෙරුම් ගොනු කරනු ඇත යන දෙකම, Unix මෙහෙයුම් mv විධානය සමීපතම බව ආඥාවයි shutil.move(). වෙනස os.rename()නම් ප්‍රභවය සහ ගමනාන්තය විවිධ තැටිවල තිබේ නම් shutil.move()එය ක්‍රියා නොකරනු ඇති අතර ලිපිගොනු කුමන තැටියේ තිබේද යන්න නොසලකයි.


77
shutil.move()os.rename()ගමනාන්තය වත්මන් ගොනු පද්ධතියේ තිබේ නම් භාවිතා කරයි . එසේ නොමැතිනම්, shutil.move()මූලාශ්‍රය ගමනාන්තයට පිටපත් කර ප්‍රභවය shutil.copy2()ඉවත් කරයි.
fmalina

8
shutil.copy2()සියලුම ගොනු පාර-දත්ත පිටපත් කළ නොහැකි බව වටහා ගැනීමට සැලකිලිමත් වන්න , එබැවින් එය සිදුවුවහොත් එය සිදු කිරීම cp -pහා පසුව සිදු rmවේ.
2rs2ts

9
දැනුවත් වන්න: ගමනාන්තය දැනටමත් තිබේ නම් පයිතන් 2.7.3 හි shutil.move අසමත් වේ. එබැවින් එය කළ හැකි නම්, එක්කෝ දෝෂය හසුකර ගන්න, නැතහොත් / dir ගොනුව අතින් ඉවත් කරන්න, ඉන්පසු පියවර ගන්න.
ඩනා

40

Os.rename හෝ shutil.move සඳහා ඔබට මොඩියුලය ආයාත කිරීමට අවශ්‍ය වනු ඇත. සියලුම ලිපිගොනු ගෙනයාමට * අක්ෂරයක් අවශ්‍ය නොවේ.

Wands.txt නමින් එක් ගොනුවක් සමඟ අපට / opt / නියමයි මූලාශ්‍රයේ ෆෝල්ඩරයක් ඇත.

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']

මේ වතාවේ මම ප්‍රභව ෆෝල්ඩරය තුළ පරීක්ෂා කර බැලුවෙමි, මා විසින් නිර්මාණය කරන ලද නියමයි. Txt ගොනුව පවතින බව. එය එහි වේ :)

දැන් අපි ෆෝල්ඩරයක් සහ එහි ලිපිගොනු ප්‍රභවයකින් ගමනාන්තයකට ගෙන ගොස් නැවත යමු.


4
docs.python.org/2/library/shutil.html මෙම ලේඛනය පෙන්වන්නේ ඔබ විසින් ඔබේ පරාමිතීන් shutil.move ක්‍රමය සඳහා මාරු කර ඇති බවයි.
mac10688

2
මම ගමනාන්තය භාවිතා කළ අතර මූලාශ්‍රය ආපසු හරවා ගොනුව ප්‍රභවයෙන් ගෙන ගොස් නැවත එය වෙතට ගියෙමි .... එය අපැහැදිලි වන්නේ කෙසේදැයි මට පෙනුණි.
jmontross

40

පයිතන් 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


3
"පාත්ලිබ් ආනයන මාවතෙන්" ආනයනය කිරීම ඉතා හොඳය :)
ටූහිඩ්

Path("path/to/current/file.foo").rename("path/to/new/destination/for/".joinpath(Path.name)) සියලුම * .LNK (කෙටිමං) ලිපිගොනු DUMP නාමාවලියකට ගෙනයාමට මම එය මෑතකදී -> ස්වරූපයෙන් භාවිතා කළෙමි . චාම් එකක් වගේ වැඩ කළා! : ඩී
අමර්

20

මේ මොහොතේ මම භාවිතා කරන්නේ මෙයයි:

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)

දැන් සම්පූර්ණයෙන්ම ක්‍රියාත්මකයි. මෙය ඔබට උපකාරී වේ යැයි සිතමි.

සංස්කරණය කරන්න:

මම මෙය ශ්‍රිතයක් බවට පත් කර ඇති අතර, එය ප්‍රභවයක් සහ ගමනාන්ත නාමාවලියක් පිළිගෙන, ගමනාන්ත ෆෝල්ඩරය නොපවතින නම් සහ ගොනු ගෙන යයි. Src ගොනු පෙරීමට ද ඉඩ දෙයි, නිදසුනක් ලෙස ඔබට රූප පමණක් ගෙනයාමට අවශ්‍ය නම්, ඔබ රටාව භාවිතා කරයි '*.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)හරස් වේදිකා ගැටළු මඟහරවා ගැනීම සඳහා නූල්
සම්මුතිය

12

පිළිගත් පිළිතුර නිවැරදි එකක් නොවේ, මන්ද ප්‍රශ්නය වන්නේ ගොනුවක් ගොනුවකට නැවත නම් කිරීම ගැන නොව බොහෝ ගොනු නාමාවලියකට ගෙන යාමයි. ගමනාන්තයට පැහැදිලි ගොනු නාමයක් තිබිය යුතු බැවින් shutil.moveමෙම කාර්යය os.renameනිෂ් less ල ය (අදහස් දැක්වීම්වල සඳහන් පරිදි).


නිෂ් less ල නොවේ, බහු ගොනු ගෙනයාමට එය ලබා ගැනීම සඳහා වැඩි වැඩ කොටසක් අවශ්‍ය වේ. ඔබට ගොනු නාම os.path.basename(my_file_path)සහ ගොනු නාමාවලි සමඟ ලබා ගත හැකිය os.path.dirname(my_file_path). මීට අමතරව, ඔහුට බහු ලිපිගොනු ගෙනයාමට අවශ්‍ය නම් එය OP විසින් පැහැදිලි කර නොතිබුණි. ප්‍රශ්නයේ එක් ගොනුවක් පමණක් ගෙනයාම ඔහු සඳහන් කළ නමුත් ඔහුගේ උදාහරණ කේතය මඟින් ගොනු කිහිපයක් ගෙනයාම අදහස් විය.
ජැක් මැතිව්

3

මෙහි විස්තර කර ඇති පිළිතුර මත පදනම්ව , භාවිතා subprocessකිරීම තවත් විකල්පයකි.

මේ වගේ දෙයක්:

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

සාපේක්ෂව මෙම ක්‍රමයේ ගැති සහ කොන් දැන ගැනීමට මට කුතුහලයක් ඇත shutil. මගේ නඩුවේදී මම දැනටමත් subprocessවෙනත් හේතූන් සඳහා භාවිතා කරන අතර එය ක්‍රියාත්මක වන බවක් පෙනෙන්නට ඇති හෙයින් මම එයට ඇලී සිටිමි.

සමහර විට එය පද්ධතිය මත රඳා පවතීද?


2
මෙය පද්ධතිය මත රඳා පවතී යැයි මම විශ්වාස කරමි. mvවින්ඩෝස් මෙහෙයුම් පද්ධතියක සාර්ථකව භාවිතා වන බවක් මට නොපෙනේ .
ජොෂුවා ෂ්ලිච්ටිං

1

මෙය විසඳුමකි, එය shellභාවිතා කිරීමට ඉඩ නොදේ mv.

import subprocess

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

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

if p.returncode:
    print(f"E:{output}")

-1
  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}"නමුත් ඔබේ නූලෙහි ස්ථිතික පෙළක් නොමැති බැවින් මෙය තවත් වැඩක් විය හැකිය .... මම භාවිතා කිරීමේ පුරුද්දට පිවිසීමට උත්සාහ කරමි f- නූල් වුවද.
ජුසෝපි

ඔබ අදහස් කරන්නේ f වෙනුවට ගොනුවක්ද?
මතෙව්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.