Hoe verplaats ik een bestand in Python?

Ik heb in de Python os-interface gekeken, maar kon geen methode om een ​​bestand te verplaatsen. Hoe zou ik het equivalent van $ mv ...in Python doen?

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

Antwoord 1, autoriteit 100%

os.rename(), shutil.move(), of os.replace()

Allemaal gebruiken dezelfde syntaxis:

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")

Houd er rekening mee dat u de bestandsnaam (file.foo) moet opnemen in zowel de bron- als de bestemmingsargumenten. Als het wordt gewijzigd, wordt het bestand zowel hernoemd als verplaatst.

Merk ook op dat in de eerste twee gevallen de directory waarin het nieuwe bestand wordt aangemaakt al moet bestaan. In Windows mag een bestand met die naam niet bestaan, anders wordt er een uitzondering gemaakt, maar os.replace()zal een bestand stilzwijgend vervangen, zelfs in dat geval.

Zoals is opgemerkt in opmerkingen over andere antwoorden, roept shutil.movein de meeste gevallen gewoon os.renameaan. Als de bestemming zich echter op een andere schijf dan de bron bevindt, zal deze in plaats daarvan het bronbestand kopiëren en vervolgens verwijderen.


Antwoord 2, autoriteit 16%

Hoewel os.rename()en shutil.move()beide bestanden hernoemen, is het commando dat het dichtst bij het Unix mv commando ligt shutil.move(). Het verschil is dat os.rename()niet werkt als de bron en bestemming zich op verschillende schijven bevinden, terwijl het voor shutil.move()niet uitmaakt op welke schijf de bestanden zijn ingeschakeld.


Antwoord 3, autoriteit 4%

Na Python 3.4 kunt u ook de klasse Pathvan Pathgebruiken om het bestand te verplaatsen.

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


Antwoord 4, autoriteit 2%

Voor os.rename of shutil.move moet je de module importeren.
Er is geen *-teken nodig om alle bestanden te verplaatsen.

We hebben een map op /opt/awesome genaamd source met één bestand met de naam awesome.txt.

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

We hebben os.listdir gebruikt om te zien dat de mapnaam inderdaad is gewijzigd.
Hier is de Shutil die de bestemming terug naar de bron verplaatst.

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

Deze keer heb ik in de bronmap gekeken of het geweldige.txt-bestand dat ik heb gemaakt, bestaat. Het is er 🙂

Nu hebben we een map en zijn bestanden verplaatst van een bron naar een bestemming en weer terug.


Antwoord 5

Dit is wat ik momenteel gebruik:

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)

Nu volledig functioneel. Ik hoop dat dit je helpt.

Bewerken:

Ik heb hier een functie van gemaakt, die een bron- en doelmap accepteert, de doelmap maakt als deze niet bestaat, en de bestanden verplaatst. Maakt het ook mogelijk om de src-bestanden te filteren, bijvoorbeeld als u alleen afbeeldingen wilt verplaatsen, dan gebruikt u het patroon '*.jpg', standaard verplaatst het alles in de map

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))

Antwoord 6

Het geaccepteerde antwoord is niet het juiste, omdat de vraag niet gaat over het hernoemen van een bestand naar een bestand, maar het verplaatsen van veel bestanden naar een map. shutil.movezal het werk doen, maar voor dit doel is os.renamenutteloos (zoals vermeld in opmerkingen) omdat de bestemming een expliciete bestandsnaam moet hebben.


Antwoord 7

Ook mogelijk met de methode subprocess.run().

python:
>>> import subprocess
>>> new = "/path/to/destination"
>>> old = "/path/to/new/destination"
>>> process = "mv ..{} ..{}".format(old,new)
>>> subprocess.run(process, shell=True) # do not remember, assign shell value to True.

Dit werkt prima als je onder Linux werkt. Windows geeft waarschijnlijk een foutmelding omdat er geen mv-opdracht is.


Antwoord 8

Op basis van het antwoord hier beschreven, het gebruik van subprocessis een andere optie.

Zoiets:

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

Ik ben benieuwd naar de voor- en nadelen van deze methode in vergelijking met shutil. Aangezien ik in mijn geval al om andere redenen subprocessgebruik en het lijkt te werken, ben ik geneigd om het vol te houden.

Is het misschien systeemafhankelijk?


Antwoord 9

Dit is een oplossing die shellniet activeert met mv.

from subprocess import Popen, PIPE, STDOUT
source = "path/to/current/file.foo", 
destination = "path/to/new/destination/for/file.foo"
p = Popen(["mv", "-v", source, destination], stdout=PIPE, stderr=STDOUT)
output, _ = p.communicate()
output = output.strip().decode("utf-8")
if p.returncode:
    print(f"E: {output}")
else:
    print(output)

Antwoord 10

 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 

andere schijf bijv. C: –> D:

Other episodes