как сделать путь к файлу глобальной переменной в python? - PullRequest
0 голосов
/ 29 мая 2020

Я получаю эту ошибку NameError: name 'filep' is not defined Мне нужно указать filep как путь к файлу. но каждый раз, когда я запускаю свой код, я всегда получаю эту ошибку.

Мне нужно сделать filep как переменную модуля, а не как параметр, а также список меню.

import csv

filep= # filepath
menulist = [] #global scope


def menu_List():

    global menulist 
    menulist = []  # store items
    try:
        with open(filep) as f:  # read file
            reader = f.readlines()
            next(reader, None) #skip the header

            for row in reader:
                row[2] = int(row[2].strip()) #convert string to int
                row[1] = float(row[1].strip()) #convert string to float
                if row[2] > 100 and row[2] < 200:
                    menulist.append(row)
    except NameError:
        raise ValueError("Variable not set")

    menulist.sort(key=lambda x: x[-1])

menu_List()

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Здесь вам не нужны глобальные переменные, ваша функция должна принимать путь в качестве аргумента и возвращать список меню.

import csv

def menu_List(filep):

    menulist = []  # store items
    try:
        with open(filep) as f:  # read file
            reader = f.readlines()
            next(reader, None) #skip the header

            for row in reader:
                row[2] = int(row[2].strip()) #convert string to int
                row[1] = float(row[1].strip()) #convert string to float
                if row[2] > 100 and row[2] < 200:
                    menulist.append(row)
    except NameError:
        raise ValueError("Variable not set")

    menulist.sort(key=lambda x: x[-1])
    return menulist

menulist = menu_List("a/path/goes/here")

Не связано с вашим вопросом, вы можете пропустить заголовок, как вы это делали или хотели это:

reader = f.readlines()
for row in reader[1:]: # skip the first line.
    ...
2 голосов
/ 29 мая 2020

Ответ выше (который использует аргументы для fliep) - лучшее решение, но если вы решили не использовать аргументы:

filep= 'file path you want'# filepath
menulist = [] #global scope


def menu_List():
    global filep #just add one more global will make it work
    global menulist 
    menulist = []  # store items
    try:
        with open(filep) as f:  # read file
            reader = f.readlines()
            next(reader, None) #skip the header

            for row in reader:
                row[2] = int(row[2].strip()) #convert string to int
                row[1] = float(row[1].strip()) #convert string to float
                if row[2] > 100 and row[2] < 200:
                    menulist.append(row)
    except NameError:
        raise ValueError("Variable not set")

    menulist.sort(key=lambda x: x[-1])

menu_List()

Дополнительный небольшой совет: попробуйте предотвратить использование global var, если можете, global var замедляет скорость программы и съедает память, также иногда вызывая беспорядочное именование переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...