I am trying to move files and folders from directory to another. I am currently facing two issues.
It only seems to move files but not any folders.
It only picks up the uppercase or lowercase.
Do you know what might be missing to do this. I could add an or statement statement with startswith but would like to see if there is a better way to do this.
import os
from os import path
import shutil
src = "C:/Users/test/documents/"
dst = "C:/Users/test/Documents/test"
files = [i for i in os.listdir(src) if i.startswith("C") and \
path.isfile(path.join(src, i))]
for f in files:
shutil.move(path.join(src, f), dst)
This will go through the source directory, create any directories that do not yet exist in the destination directory, and move the files from the source to the destination directory:
(As I understand it, this is what you want)
import os
import shutil
src = "C:/Users/test/documents/"
dst = "C:/Users/test/documents/test"
for src_dir, dirs, files in os.walk(src):
dst_dir = src_dir.replace(src, dst, 1)
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
for file_ in files:
src_file = os.path.join(src_dir, file_)
dst_file = os.path.join(dst_dir, file_)
if os.path.exists(dst_file):
os.remove(dst_file)
shutil.move(src_file, dst_dir)
Related
I have a path mydir where i have file1,file2, .. file100 each folder have .crc,.bak etc, files i want to remove all files and keep only .parquet files and name the .parquet files with folder name
for eg., file1 folder have .crc,.bak files after removing we end up with .parquet i need to name this as file1.parquet.
I tried to remove one folder but couldnot do it for all folders uisng python
can someone help me how to solve this
mydir='c/users/name/files'
for f in os.listdir(mydir):
if f.endswith(".parquet"):
continue
os.remove(os.path.join(mydir, f))
Following Miguel's comment, you can use glob like this:
import glob
import os
mydir = "./"
dir_to_remove = []
for src_file in glob.glob(mydir + '**/.parquet', recursive=True):
dir_, file_ = src_file.rsplit('/', 1)
dir_to_remove.append(dir_)
dst_file = dir_ + file_
os.rename(src_file, dst_file)
for dir_ in dir_to_remove:
os.rmdir(dir_)
Friends, I'm working with some folders and I'm having a hard time moving files from one folder to another. I tried to use the command shutil.move (), but I can only move one file or all that are present in the folder. I would like to move only a few files present in the folder. I thought about making a list with the name of the files, but it didn't work, could someone help me please?
follow my code:
import shutil
source = r'C:\Users1'
destiny = r'C:\Users2'
try:
os.mkdir(destiny)
except FileExistsError as e:
print (f'folder {destiny} already exists.')
for root, dirs, files in os.walk(source):
for file in files:
old_way = os.path.join(root, file)
new_way = os.path.join(destiny, file)
if ['arq1','arq2'] in file:
shutil.move(old_way, new_way)
from shutil import copyfile
import os
from os import listdir
from os.path import isfile, join
source = '/Users/xxx/path'
destiny = '/Users/xxx/newPath'
onlyfiles = [f for f in listdir(source) if isfile(join(source, f))]
for file in onlyfiles:
if ['arq1','arq2'] in file:
src = source+"/"+file
dst = destiny+"/"+file
copyfile(src,dst)
If the file is already in the new directory it will automatically replace it
I work in audio and I need a number of files transcribed by a third party. To do so I have to swap out an entire directory of .wav files with .mp3s I have compressed while still maintaining the file directory. It's about 20,000 files.
e.g.
wav:
Folder1
Folder 1a
sound1.wav
sound2.wav
Folder 1b
sound3.wav
sound4.wav
Folder2
Folder 2a
Folder 2aa
sound5.wav
sound6.wav
Folder 2ab
sound7.wav
Folder2b
sound8.wav
etc.
mp3:
Folder1
sound1.mp3
sound2.mp3
sound3.mp3
sound4.mp3
sound5.mp3
sound6.mp3
sound7.mp3
sound8.mp3
etc.
I had to group them together to do the batch compression in Adobe Audition, but now I would like to be able to switch them out with the wav files that are perfectly identical save for file extension as doing this manually is not a reasonable option.
Any help would be greatly appreciated. I have a little experience with python so that language is preferable, but I'm open to any solutions.
You can use a combination of glob and shutil to do this. Try running this script from inside Folder1.
from glob import glob
from shutil import move
import os
wav_files = glob('**/*.wav', recursive=True)
for wf in wav_files:
file_path = os.path.splitext(wf)[0]
file_head = os.path.split(file_path)[-1]
try:
move('./{}.mp3'.format(file_head),
'{}.mp3'.format(file_path))
except:
print('Could not find or move file {}.mp3, it may not exist.'.format(file_head))
What I understand is that you want the same directory structure for mp3 as for vaw.
You can:
browse the directory structure of vaw file and construct a mapping between base names (file names without extension) and relative path.
browse the directory structure, searching the mp3 files and find each relative path in the mapping, creating the target directory structure if missing and move the file in.
For instance:
import os
vaw_dir = 'path/to/MyVaw' # parent of Folder1...
musics = {}
for root, dirnames, filenames in os.walk(vaw_dir):
for filename in filenames:
basename, ext = os.path.splitext(filename)
if ext.lower() == '.wav':
relpath = os.path.relpath(root, vaw_dir)
print('indexing "{0}" to "{1}"...'.format(filename, relpath))
musics[basename] = relpath
else:
print('skiping "{0}"...'.format(filename))
mp3_dir = 'path/to/MyMp3'
out_dir = vaw_dir # or somewhere else
for root, dirnames, filenames in os.walk(vaw_dir):
for filename in filenames:
basename, ext = os.path.splitext(filename)
if ext.lower() == '.mp3' and basename in musics:
relpath = musics[basename]
path = os.path.join(out_dir, relpath)
if not os.path.exists(path):
print('creating directory "{0}"...'.format(path))
os.makedirs(path)
src_path = os.path.join(root, filename)
dst_path = os.path.join(path, filename)
if src_path != dst_path:
print('moving "{0}" to "{1}"...'.format(filename, relpath))
os.rename(src_path, dst_path)
else:
print('skiping "{0}"...'.format(filename))
print("Done.")
I have folder that has subfolders each with many different files.
I'd like to copy all of the files (not subdirectories) into one folder
import os
import shutil
src = r'C:\TEMP\dir'
dest = r'C:\TEMP\new'
src_files = os.listdir(src)
for file_name in src_files:
full_file_name = os.path.join(src, file_name)
if (os.path.isfile(full_file_name)):
shutil.copy(full_file_name, dest)
when I run the code, there is no error but no files is copied either.
I do not know what is wrong with the code.
You can try this
import os
import shutil
src = r'C:\TEMP\dir'
dest = r'C:\TEMP\new'
for path, subdirs, files in os.walk(src):
for name in files:
filename = os.path.join(path, name)
shutil.copy2(filename, dest)
I am trying to use the os.walk() module to go through a number of directories and move the contents of each directory into a single "folder" (dir).
In this particular example I have hundreds of .txt files that need to be moved. I tried using shutil.move() and os.rename(), but it did not work.
import os
import shutil
current_wkd = os.getcwd()
print(current_wkd)
# make sure that these directories exist
dir_src = current_wkd
dir_dst = '.../Merged/out'
for root, dir, files in os.walk(top=current_wkd):
for file in files:
if file.endswith(".txt"): #match files that match this extension
print(file)
#need to move files (1.txt, 2.txt, etc) to 'dir_dst'
#tried: shutil.move(file, dir_dst) = error
If there is a way to move all the contents of the directories, I would be interested in how to do that as well.
Your help is much appreciated! Thanks.
Here is the file directory and contents
current_wk == ".../Merged
In current_wkthere is:
Dir1
Dir2
Dir3..
combine.py # python script file to be executed
In each directory there are hundreds of .txtfiles.
Simple path math is required to find source files and destination files precisely.
import os
import shutil
src_dir = os.getcwd()
dst_dir = src_dir + " COMBINED"
for root, _, files in os.walk(current_cwd):
for f in files:
if f.endswith(".txt"):
full_src_path = os.path.join(src_dir, root, f)
full_dst_path = os.path.join(dst_dir, f)
os.rename(full_src_path, full_dst_path)
You have to prepare the complete path of source file, and make sure dir_dst exists.
for root, dir, files in os.walk(top=current_wkd):
for file in files:
if file.endswith(".txt"): #match files that match this extension
shutil.move(os.path.join(root, file), dir_dst)