Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OSError: Directory not empty raised, how to fix?

I'm just trying to write a little application that takes a value from a file named 'DATA.DAT' and renames the folder which contains that file with that value.

The .py script runs in another folder and allows the user to define the path. To give you a better idea, the user defined path must be like (on a mac) '/Users/User/Desktop/FOLDER' and 'FOLDER' should contain 'DATA.DAT'.

That's how a little part of the source code looks like:

try:
    data = open('DATA.DAT').read()

    data_data = data[12:17]
    path_paths = path.rsplit('/')
    basepath = '/'.join(path_paths[:-1])
    chdir(basepath)

    if path_paths[-1] <> data_data:
        rename(path_paths[-1], data_data)
        raw_input('Folder name has been corrected! Thank you.')
        quit()
    else:
        print('Folder name was already correct! Thank you.')
        quit()
except IndexError:
    raw_input('ERROR!')
    quit()

Well, it works; but it raise and exception when 'FOLDER' contains more than one file (actually, 'FOLDER' should contain just 'DATA.DAT' and other folders. That doesn't give problems.)...

Traceback (most recent call last):
  File "/Users/User/Desktop/example.py", line 72, in <module>
    rename(path_paths[-1], data_data)
OSError: [Errno 66] Directory not empty

Just to prevent that this happens, is there a way to fix it? Thanks.

like image 793
PyGuy Avatar asked Sep 20 '11 14:09

PyGuy


People also ask

How do I delete a non empty directory in Python?

Shutil rmtree() to Delete Non-Empty Directory The rmtree('path') deletes an entire directory tree (including subdirectories under it). The path must point to a directory (but not a symbolic link to a directory). Set ignore_errors to True if you want to ignore the errors resulting from failed removal.

How do I delete a non empty folder in Jupyter notebook?

“delete non empty directory python” Code Answer's os. rmdir('/your/folder/path/') #removes an empty directory. shutil. rmtree('/your/folder/path/') #deletes a directory and all its contents.


2 Answers

Edit: The right tool is shutil.move:

shutil.move(path_paths[-1], data_data)

assuming path_paths[-1] is the absolute directory you want to rename, and data_data is the absolute directory name you want to rename it to.

The destination directory must not already exist for this to work. The two locations don't need to be on the same filesystem.


Old answer: Use os.renames instead of os.rename.

It will recursively create any needed directories.

like image 172
agf Avatar answered Sep 28 '22 02:09

agf


It is much easier to use shutil.

like image 34
SanityIO Avatar answered Sep 28 '22 02:09

SanityIO