Я посмотрел на os
интерфейс Python , но не смог найти метод для перемещения файла. Как бы я сделал эквивалент $ mv ...
в Python?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
python
file
file-handling
David542
источник
источник
mv
, в pythonshutil.move
есть один крайний случай, когдаshutil.move
функция отличается. Иди сюда для полной записи . В двух словах, Pythonshutil.move
будет вызывать исключение (но gnu-coreutilsmv
не будет), когда вашим местом назначения является каталог, а в каталоге уже есть файл с тем же именем, что и у источника (опять же, для получения дополнительной информации см. Ссылку, приведенную в предыдущем предложении). ).os.system("mv file1 file2")
?Ответы:
os.rename()
,shutil.move()
Илиos.replace()
Все используют один и тот же синтаксис:
Обратите внимание, что вы должны включить имя файла (
file.foo
) в исходные и конечные аргументы. Если он изменен, файл будет переименован, а также перемещен.Также обратите внимание, что в первых двух случаях каталог, в котором создается новый файл, уже должен существовать. В Windows файл с таким именем не должен существовать, иначе возникнет исключение, но он
os.replace()
будет автоматически заменять файл даже в этом случае.Как было отмечено в комментариях к другим ответам, в большинстве случаев
shutil.move
просто звонкиos.rename
. Однако, если место назначения находится на диске, отличном от исходного, оно вместо этого скопирует и затем удалит исходный файл.источник
shutil.move
работает для каталогов. Вы можете использовать относительный путьshutil.move(f.name, "tmp/")
или полный путьshutil.move(f.name, "/Users/hello/tmp/")
, не использовать~
в пути, проверено в python2.7.9, Mac OS X.~
является оболочкой и не имеет ничего общего с путями к файлам как таковым, за исключением неуместного соглашения. Если вы действительно хотите задействовать свой домашний каталог, используйтеos.getenv('HOME')
вместо этого, объединяя его с частями желаемого пути, если это необходимо.os.path.expanduser()
для правильного расширения '~
' в соответствии с ос-специфическими правилами. Намного аккуратнее, так%HOME%
как не всегда устанавливается на Windows.os.rename
не будет обрабатывать файлы на разных устройствах. Используйте,shutil.move
если вы не уверены, что исходный файл и файл назначения находятся на одном устройстве.Хотя
os.rename()
иshutil.move()
будут переименовывать файлы, команда, которая ближе всего к команде Unix mvshutil.move()
. Разница в том, чтоos.rename()
не работает, если источник и место назначения находятся на разных дисках,shutil.move()
и не заботится о том, на каком диске находятся файлы.источник
shutil.move()
использует,os.rename()
если место назначения находится в текущей файловой системе. В противном случаеshutil.move()
копирует источник в пункт назначения с помощью,shutil.copy2()
а затем удаляет источник.shutil.copy2()
нельзя копировать все метаданные файла , поэтому, если это произойдет, это все равно что делать,cp -p
а потомrm
я собираюсь.Для os.rename или shutil.move вам нужно будет импортировать модуль. Символ * не требуется для перемещения всех файлов.
У нас есть папка в / opt / awesome с именем source и одним файлом с именем awesome.txt.
Мы использовали os.listdir, чтобы увидеть, что имя папки действительно изменилось. Вот шутиль, перемещающий пункт назначения обратно к источнику.
На этот раз я проверил внутри исходной папки, чтобы убедиться, что созданный мной файл awesome.txt существует. Это там :)
Теперь мы переместили папку и ее файлы из источника в место назначения и обратно.
источник
После Python 3.4 вы также можете использовать
pathlib
классPath
для перемещения файла.https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
источник
Это то, что я использую в данный момент:
Теперь полностью функциональный. Надеюсь, это поможет вам.
Редактировать:
Я превратил это в функцию, которая принимает каталог источника и назначения, создает папку назначения, если она не существует, и перемещает файлы. Также позволяет фильтровать файлы src, например, если вы хотите только перемещать изображения, то вы используете шаблон
'*.jpg'
, по умолчанию он перемещает все в каталогеисточник
os.path.join(parent_path, filename)
вместо конкатенации строк, чтобы избежать кросс-платформенных проблемПринятый ответ не является правильным, потому что вопрос не в переименовании файла в файл, а в перемещении многих файлов в каталог.
shutil.move
будет делать работу, но для этой целиos.rename
бесполезно (как указано в комментариях), потому что пункт назначения должен иметь явное имя файла.источник
os.path.basename(my_file_path)
и каталоги файлов с помощьюos.path.dirname(my_file_path)
. Кроме того, ОП не очень ясно дал понять, хочет ли он переместить несколько файлов. Он упомянул перемещение только одного файла в вопросе, но его пример кода подразумевал перемещение нескольких файлов.Исходя из ответа, описанного здесь , использование
subprocess
является еще одним вариантом.Что-то вроде этого:
Мне любопытно знать за и против этого метода по сравнению с
shutil
. Так как в моем случае я уже используюsubprocess
по другим причинам, и, кажется, это работает, я склонен придерживаться этого.Возможно, это зависит от системы?
источник
mv
успешного использования в операционной системе Windows.Это решение, которое не позволяет
shell
использоватьmv
.источник
другой диск отл. C: -> D:
источник
f"{new_path}{f}"
но, учитывая, что в вашей строке нет статического текста, это может быть больше работы .... Я пытался привыкнуть к использованию ф-струн хотя.