Search code examples
pythonpython-3.xfile-handling

why python get me this error: filenotfound


i have a irrational error, code:

#====================================================#
#X Programming Language 2022(for Jadi) License: GPL  #
#====================================================#
from os import system #importing system func. for cmd

code_location = "" #saving code location in this
code = ""          #saving code in this

def main(): #main func.
    code_location = input() #get code location from user
    code = get_code() #cal get_code and save res to code var
    print(code) #print code
    end() #calling end

def get_code(): #get_code func. for getting code from file
    code_file = open(code_location, 'r') #openning file with method read and saving to code_file
    res = code_file.readlines() #saving the content from file to res
    return res #returning res

def compiler(): #compiler func. for compiling code
    pass

def end(): #when program end...
    input("Press Enter to Countinue...")

if __name__ == "__main__":
    main()

and this is code directory: enter image description here

running:

enter image description here


Solution

  • Short answer: Your two code_location variables are not the same thing.

    Variable scopes

    Variables have a property called a scope, which is essentially which context they belong to. Unless specified otherwise, variables within a function exist only within that function. Consider:

    a = 0
    
    def set_a():
        a = 1
    
    set_a()
    print(a)
    

    This will print 0. This is because the a variable within the function set_a is actually a different variable to the a defined in line 1. Although they have the same name, they point to different places in memory.

    Solutions

    There are a few ways to do this:

    Defining scope

    Either, you can set the scope of a within the function to global (instead of local). What this does is now, instead of a within the function pointing to a different memory location, it points to the same memory location as a outside the variable. This is done like so:

    a = 0
    
    def set_a():
        global a
        a = 1
    
    set_a()
    print(a)
    

    In this case, a will be set to 1, and "1" will be printed

    Passing as an argument

    Another way to do this, and may be more relevant in your circumstance, is to pass the value as a variable to the function. In your case, you are using code_location as the file path, so therefore what you want to pass code_location into the function. You would then have to define your function like this:

    def get_code(code_location):
    

    and call the function (from your main function) like this:

    code = get_code(code_location)
    

    Notes

    When operating on files, it is best practice to use a with block. This handles closing your file when you are done with it, and can prevent corruption of files in the rare case that something goes wrong with your code. This can be done like this:

    with open(code_location, 'r') as code_file:
        res = code_file.readlines()
    return res