Crizz
Crizz

Reputation: 35

Python: FileNotFoundError: [WinError 3] The system cannot find the path specified: ''

I am creating a program in Python to automatically backup my flash drive to. The first backup, it works great, but when it repeats the process to backup again, I get this error message.

File "D:\Programming\_Languages\Python\Automatic_Backup\Automatic_Backup.py", line 51, in <module>
    shutil.copytree(src, dst)
  File "C:\Users\carso\AppData\Local\Programs\Python\Python35-32\lib\shutil.py", line 303, in copytree
    names = os.listdir(src)
FileNotFoundError: [WinError 3] The system cannot find the path specified: ''

The contents of path_dst.txt are "C://Users//carso//Dropbox//Backup" (No quotes). The contents of path_src.txt are "D://Programming" (Again, no quotes).

I have been searching to try and find a solution, but I don't know how to fix this. Here is the code to the program, I would appreciate any help.

import shutil
import os
import time

with open('program_started.txt', 'r+') as program_started_file:
    # If program was previously started, runs instructions. If not, continues as normal
    program_started = program_started_file.read()
    if program_started == 'False':
        # Gets src path file and dst path file, write only
        src_file = open('path_src.txt', 'w')
        dst_file = open('path_dst.txt', 'w')
        # Gets src and dst paths
        src_path = input('Enter source path: ') 
        dst_path = input('Enter destination path: ')
        # Writes src and dst paths to txt file
        src_file.write(src_path)
        dst_file.write(dst_path)
        # Moves to beginning of document
        program_started_file.seek(0)
        # Writes 'True' in front of prevous 'False'
        program_started_file.write('True')
        # Removes 'False'
        program_started_file.truncate()
        # Displays 'Completed' message
        print("Completed getting source and destination paths")
    elif program_started == 'True':
        # Gets src path file and dst path file, read only
        src_file = open('path_src.txt', 'r')
        dst_file = open('path_dst.txt', 'r')
        # Checks if flash drive is plugged in
        while True:
            if os.system('cd D:') == 0:
                # Stores src path and dst path in string
                src = src_file.read()
                dst = dst_file.read()
                # If a 2nd backup has been made, removes first and renames 2nd
                if os.path.isdir(dst + "_2") == True:
                    os.rmdir(dst)
                    os.rename(dst + "_2", dst)
                    dst = dst + "_2"
                 # If only a 1st backup was made, creates a 2nd
                elif os.path.isdir(dst) == True:
                    dst = dst + "_2"
                # Copies data
                print('Backing up...', end='')
                shutil.copytree(src, dst)
                print('Completed')
                # Sleeps for 20 minutes
                for x in range(1,12):
                    print("Second: ", x)
                    time.sleep(1)
            else:
                # If no flash drive is detected, tries again in 5 minutes. 
                time.sleep(600)
    else:
        # Error message if program_started.txt != true or false
        print("Error: program_started.txt must only contain either 'True' or 'False'.")

Upvotes: 3

Views: 68795

Answers (4)

Nisarg Patel
Nisarg Patel

Reputation: 1

To solve this problem, first print the function os.listdir() using print(os.listdir). From this you will come to know in which folder you are and then open other sub-folders using '/'. This worked for me.

Upvotes: 0

Kashif Anwar
Kashif Anwar

Reputation: 198

Just remove white spaces from your path like:

path = your_path.strip()

Then it will work fine

Upvotes: 0

Devvrat Hirve
Devvrat Hirve

Reputation: 31

You have to give the absolute path ,not the relative paths.

I have written a simple code for your help.

import os
import shutil

source1 = os.listdir("C:/Users/ved/Documents/source/")
destination = "C:/Users/ved/Documents/dest"


for file in source1:
   fname=file
   x=("C:/Users/Eccella/Documents/source/"+fname)  #for giving absolute path
   #print(x)
   shutil.move(x, destination    #for moving from absolute path to destination folder

Upvotes: 3

SoreDakeNoKoto
SoreDakeNoKoto

Reputation: 1185

You've already read and exhausted the file during the first backup, therefore an empty string is returned for future reads = Invalid path = FileNotFoundError.

You have to go back to the beginning with seek(). Place:

src_file.seek(0)
dst_file.seek(0)

after while True:.

If some files are read-only, it could prevent rmtree() from working. Define this function:

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

And then call rmtree() like this:

shutil.rmtree(dst, onerror=remove_readonly)

Upvotes: 3

Related Questions