M-am uitat în Python os
interfață, dar a fost imposibil să găsească o metodă pentru a muta un fișier. Cum aș face echivalentul a `$ mv ... în Python?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
os.redenumiți()
, shutil.muta()
, sau os.replace()
Toate folosesc aceeași sintaxă:
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")
Rețineți că trebuie să includeți numele de fișier (file.foo) în atât sursa cât și destinația argumente. Dacă este schimbat, fișierul va fi redenumit ca bine ca s-a mutat. Rețineți, de asemenea, că, în primele două cazuri directorul în care fișierul nou este creat trebuie să existe deja. Pe Windows, un fișier cu acest nume nu trebuie să existe sau va fi generata o exceptie, dar
os.replace()` va înlocui tăcere un fișier, chiar în acel eveniment.
După cum a fost menționat în comentariile de pe alte răspunsuri, shutil.muta
doar `os.redenumiți în cele mai multe cazuri. Cu toate acestea, în cazul în care destinația este pe un alt disc decât sursa, în schimb se va copia și apoi ștergeți fișierul sursă.
Deși os.rename () " și " shutil.muta()
atât va redenumi fișierele, comanda care este cel mai apropiat de Unix mv comanda este shutil.muta()
. Diferența este că os.rename()
nu't funcționa dacă sursa și destinația sunt pe diferite discuri, în timp ce shutil.muta()
nu't pasă ce disc fișierele sunt pe.
Fie pentru sistemul de operare.redenumiți sau shutil.mutare va fi nevoie pentru a importa modulul. Nu * personajul este necesar pentru a obține toate fișierele de mutat.
Avem un folder in /opt/minunat numit sursă cu un fișier numit awesome.txt.
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']
Am folosit sistemul de operare.listdir să văd că numele folderului în fapt s-a schimbat. Aici's shutil mutarea destinație înapoi la sursă.
>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
De data asta am verificat în interiorul folderul sursă pentru a fi sigur awesome.txt dosarul l-am creat există. Este acolo :)
Acum ne-am mutat un folder și fișiere de la o sursă la o destinație și înapoi din nou.
După Python 3.4, puteți utiliza, de asemenea, pathlib
's class "Cale" pentru a muta fișierul.
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
Aceasta este ceea ce am'm, folosind în acest moment:
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)
Acum pe deplin funcțional. Sper că acest lucru vă ajută.
Am'am transformat acest lucru într-o funcție, care acceptă o sursă și directorul de destinație, de a face folderul de destinație, dacă nu't există, și se mută fișierele. De asemenea, vă permite pentru filtrarea src fișiere, de exemplu, dacă doriți doar pentru a muta imagini, apoi utilizați modelul '*.jpg'
, în mod implicit, se mișcă totul în directorul
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))
Acceptate de răspuns nu este cea corectă, pentru că întrebarea nu este despre redenumirea unui fișier într-un fișier, dar merge mai multe fișiere într-un director. shutil.muta
va face munca, dar pentru acest scop os.redenumiți
este inutil (după cum se menționează în comentarii), pentru că destinația trebuie să aibă o explicit nume de fișier.
Bazat pe răspunsul descrise aici, folosind `subproces este o altă opțiune.
Ceva de genul asta:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
Sunt curios să știu de pro's și con's de această metodă, comparativ cu shutil
. Deoarece în cazul meu, eu sunt deja folosind `subproces pentru alte motive și se pare că eu sunt înclinat să stai cu ea.
Este dependentă de sistem poate?
Aceasta este soluția, care nu permite "shell", folosind 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
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
disc diferite ex. C: --> D: