development

Python에서 파일을 이동하는 방법

big-blog 2020. 9. 29. 08:04
반응형

Python에서 파일을 이동하는 방법


Python os인터페이스를 살펴 보았지만 파일을 이동하는 방법을 찾을 수 없습니다. 어떻게에 해당 할 것이다 $ mv ...파이썬을?

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

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소스 및 대상 인수 모두에 파일 이름 ( )을 포함해야합니다 . 변경되면 파일의 이름이 변경되고 이동됩니다. 또한 처음 두 경우에는 새 파일이 생성되는 디렉토리가 이미 존재해야합니다. Windows에서는 해당 이름을 가진 파일이 없어야합니다. 그렇지 않으면 예외가 발생하지만 os.replace()그 경우에도 자동으로 파일을 대체합니다.

다른 답변에 대한 의견에서 언급했듯이 대부분의 경우 shutil.move단순히 전화하십시오 os.rename. 그러나 대상이 원본과 다른 디스크에있는 경우 원본 파일을 복사 한 다음 삭제합니다.


비록 os.rename()shutil.move()두 이름 바꾸기 파일 것, 유닉스 MV 명령에 가장 가까운 명령이다 shutil.move(). 차이점은 os.rename()소스와 대상이 다른 디스크에 있으면 shutil.move()작동하지 않고 파일이 어떤 디스크에 있는지 상관하지 않는다는 것입니다.


os.rename 또는 shutil.move의 경우 모듈을 가져와야합니다. 모든 파일을 이동하는 데 * 문자가 필요하지 않습니다.

/ opt / awesome에 awesome.txt라는 파일이있는 source라는 폴더가 있습니다.

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을 사용하여 폴더 이름이 실제로 변경되었는지 확인했습니다. 여기에 목적지를 소스로 다시 옮기는 Shutil이 있습니다.

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

이번에는 내가 만든 awesome.txt 파일이 존재하는지 확인하기 위해 소스 폴더 내부를 확인했습니다. 저기있어 :)

이제 폴더와 그 파일을 소스에서 대상으로 이동했다가 다시 돌아 왔습니다.


Python 3.4 이후에는 pathlib의 클래스 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


이것은 내가 현재 사용하고있는 것입니다.

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)

이제 완전히 작동합니다. 도움이 되었기를 바랍니다.

편집하다:

I've turned this into a function, that accepts a source and destination directory, making the destination folder if it doesn't exist, and moves the files. Also allows for filtering of the src files, for example if you only want to move images, then you use the pattern '*.jpg', by default, it moves everything in the directory

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

The accepted answer is not the right one, because the question is not about renaming a file into a file, but moving many files into a directory. shutil.move will do the work, but for this purpose os.rename is useless (as stated on comments) because destination must have an explicit file name.


Based on the answer described here, using subprocess is another option.

Something like this:

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

I am curious to know the pro's and con's of this method compared to shutil. Since in my case I am already using subprocess for other reasons and it seems to work I am inclined to stick with it.

Is it system dependent maybe?


This is solution, which does not enables shell using 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 

different disk ex. C: --> D:

참고URL : https://stackoverflow.com/questions/8858008/how-to-move-a-file-in-python

반응형