Saya melihat ke os
antarmuka Python , tetapi tidak dapat menemukan metode untuk memindahkan file. Bagaimana saya melakukan yang setara dengan $ mv ...
di Python?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
python
file
file-handling
David542
sumber
sumber
mv
, pythonshutil.move
memiliki satu sisi kasus di manashutil.move
fungsinya berbeda. Buka di sini untuk menulis lengkap . Singkatnya, Pythonshutil.move
akan memunculkan pengecualian (tetapi gnu-coreutilsmv
tidak akan) ketika tujuan Anda adalah direktori dan direktori sudah memiliki file dengan nama yang sama dengan sumber (sekali lagi untuk info lebih lanjut lihat tautan yang disediakan dalam kalimat sebelumnya ).os.system("mv file1 file2")
?Jawaban:
os.rename()
,,shutil.move()
atauos.replace()
Semua menggunakan sintaks yang sama:
Perhatikan bahwa Anda harus memasukkan nama file (
file.foo
) di argumen sumber dan tujuan. Jika diubah, file akan diganti namanya juga dipindahkan.Perhatikan juga bahwa dalam dua kasus pertama direktori di mana file baru sedang dibuat harus sudah ada. Di Windows, file dengan nama itu tidak boleh ada atau pengecualian akan dimunculkan, tetapi
os.replace()
akan diam-diam mengganti file bahkan dalam kejadian itu.Seperti yang telah dicatat dalam komentar pada jawaban lain,
shutil.move
cukup teleponos.rename
dalam banyak kasus. Namun, jika tujuan berada pada disk yang berbeda dari sumber, ia akan menyalin dan kemudian menghapus file sumber.sumber
shutil.move
berfungsi untuk direktori. Anda dapat menggunakan jalur relatifshutil.move(f.name, "tmp/")
atau jalur penuhshutil.move(f.name, "/Users/hello/tmp/")
, jangan gunakan~
di jalur, diperiksa di python2.7.9, Mac OS X.~
adalah shell konstruksi, dan tidak ada hubungannya dengan jalur file per se, selain sebagai konvensi salah tempat. Jika Anda benar-benar ingin melibatkan direktori home Anda, gunakanos.getenv('HOME')
saja, gabungkan dengan bagian dari jalur yang Anda inginkan, jika perlu.os.path.expanduser()
untuk memperluas '~
' sesuai dengan aturan os-spesifik dengan benar. Lebih rapi karena%HOME%
tidak selalu diatur pada Windows.os.rename
tidak akan menangani file di berbagai perangkat. Gunakanshutil.move
jika Anda tidak yakin sumber dan file tujuan berada pada perangkat yang sama.Meskipun
os.rename()
danshutil.move()
akan sama-sama mengganti nama file, perintah yang paling dekat dengan perintah Unix mv adalahshutil.move()
. Perbedaannya adalah bahwaos.rename()
tidak berfungsi jika sumber dan tujuan berada pada disk yang berbeda, sementarashutil.move()
tidak peduli apa disk file tersebut.sumber
shutil.move()
digunakanos.rename()
jika tujuannya adalah pada sistem file saat ini. Jika tidak,shutil.move()
salin sumber ke tujuan menggunakanshutil.copy2()
dan kemudian hapus sumbernya.shutil.copy2()
tidak dapat menyalin semua metadata file , jadi jika itu terjadi, itu seperti melakukancp -p
dan kemudianrm
, saya kumpulkan.Untuk os.rename atau shutil.move Anda perlu mengimpor modul. Tidak diperlukan karakter * untuk memindahkan semua file.
Kami memiliki folder di / opt / awesome yang disebut sumber dengan satu file bernama awesome.txt.
Kami menggunakan os.listdir untuk melihat bahwa nama folder sebenarnya berubah. Inilah shutil yang memindahkan tujuan kembali ke sumber.
Kali ini saya memeriksa di dalam folder sumber untuk memastikan file awesome.txt yang saya buat ada. Itu di sana :)
Sekarang kami telah memindahkan folder dan file-file dari sumber ke tujuan dan kembali lagi.
sumber
Setelah Python 3.4, Anda juga dapat menggunakan
pathlib
kelasPath
untuk memindahkan file.https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
sumber
Inilah yang saya gunakan saat ini:
Sekarang berfungsi penuh. Semoga ini bisa membantu Anda.
Edit:
Saya telah mengubah ini menjadi fungsi, yang menerima direktori sumber dan tujuan, membuat folder tujuan jika tidak ada, dan memindahkan file. Juga memungkinkan untuk memfilter file src, misalnya jika Anda hanya ingin memindahkan gambar, maka Anda menggunakan pola
'*.jpg'
, secara default, itu akan memindahkan semua yang ada di direktorisumber
os.path.join(parent_path, filename)
daripada penggabungan string untuk menghindari masalah lintas platformJawaban yang diterima bukan yang benar, karena pertanyaannya bukan tentang mengubah nama file menjadi file, tetapi memindahkan banyak file ke direktori.
shutil.move
akan melakukan pekerjaan, tetapi untuk tujuanos.rename
ini tidak berguna (sebagaimana dinyatakan pada komentar) karena tujuan harus memiliki nama file yang eksplisit.sumber
os.path.basename(my_file_path)
dan direktori fileos.path.dirname(my_file_path)
. Selain itu, tidak dibuat sangat jelas oleh OP jika dia ingin memindahkan banyak file. Dia menyebutkan hanya memindahkan satu file dalam pertanyaan, tetapi kode contohnya menyiratkan memindahkan beberapa file.Berdasarkan jawaban yang dijelaskan di sini , menggunakan
subprocess
adalah pilihan lain.Sesuatu seperti ini:
Saya ingin tahu pro dan kontra tentang metode ini dibandingkan dengan
shutil
. Karena dalam kasus saya, saya sudah menggunakansubprocess
untuk alasan lain dan tampaknya berhasil, saya cenderung mematuhinya.Apakah ini tergantung pada sistem?
sumber
mv
berhasil digunakan pada sistem operasi windows.Ini adalah solusi, yang tidak memungkinkan
shell
digunakanmv
.sumber
disk yang berbeda ex. C: -> D:
sumber
f"{new_path}{f}"
tetapi mengingat Anda tidak memiliki teks statis di string Anda, ini mungkin lebih banyak pekerjaan .... Saya sudah mencoba membiasakan diri menggunakan f-string meskipun.