Как преобразовать код в функццию?
есть у меня такой фрагмент кода:
ces2gTable = pd.DataFrame()
ces4gTable = pd.DataFrame()
..
else:
#print("Это выгрузка из сайта CES")
cols = [2, 6, 7, 8, 10, 14]
table = pd.read_excel(locDir+"/"+file, usecols=cols)
table = table[table["BSS"].isna()]
#print(table)
with open("output.log", "a") as outfile:
outfile.write("+ File contents received "+file+"\n")
if "BS_address" in table:
ces2gTable = pd.concat([ces2gTable,table])
elif "RMOD" in table:
ces4gTable = pd.concat([ces4gTable,table])
else:
with open("output.log", "a") as outfile:
outfile.write("- Некорректная таблица в файле "+file+"\n")
with open("output.log", "a") as outfile:
outfile.write("+ The necessary 2g 4g data from the file has been loaded into the tables "+file+"\n")
#print(table)
print("Таблицы (ces2gTable, ces4gTable) из сайта CES для того, чтобы посмотреть какие данные на сайте не заполнены:")
print(ces2gTable)
print(ces4gTable)
Как мне преобразовать такой код в функцию? этот код у меня повторяется везде. только меняется считывание колонок. Я пробовал это делать таким образом:
ces2gTable = pd.DataFrame()
ces4gTable = pd.DataFrame()
def cesTable(col1, col2, col3, col4, col5, col6):
cols = [col1, col2, col3, col4, col5, col6]
table = pd.read_excel(locDir+"/"+file, usecols=cols)
table = table[table["BSS"].isna()]
#print(table)
with open("output.log", "a") as outfile:
outfile.write("+ File contents received "+file+"\n")
if "BS_address" in table:
ces2gTable = pd.concat([ces2gTable,table])
elif "RMOD" in table:
ces4gTable = pd.concat([ces4gTable,table])
else:
with open("output.log", "a") as outfile:
outfile.write("- Некорректная таблица в файле "+file+"\n")
with open("output.log", "a") as outfile:
outfile.write("+ The necessary 2g 4g data from the file has been loaded into the tables "+file+"\n")
#print(table)
return table
...
else:
#print("Это выгрузка из сайта CES")
cesTable(2, 6, 7, 8, 10, 14)
print("Таблицы (ces2gTable, ces4gTable) из сайта CES для того, чтобы посмотреть какие данные на сайте не заполнены:")
print(ces2gTable)
print(ces4gTable)
Но у меня появляется ошибка:
Traceback (most recent call last):
File "P:\projects\FillingInDataForTheSite\py.py", line 150, in <module>
cesTable(2, 6, 7, 8, 10, 14)
File "P:\projects\FillingInDataForTheSite\py.py", line 17, in cesTable
ces4gTable = pd.concat([ces4gTable,table])
UnboundLocalError: local variable 'ces4gTable' referenced before assignment
Ответы (1 шт):
Ошибка происходит из-за того, что в функциях используются локальные переменные. По умолчанию вы можете получать значения глобальных пременных, но не изменять их. Соответственно, вместо изменения существующей переменной ces4gTable
, создаётся новая внутри функции. И прямо во время создания новой локальной переменной происходит обращение к ней. Это приводит к ошибке. Аналогичная проблема будет с ces2gTable
.
Добавьте следующую строчку сразу после определения функции:
global ces2gTable, ces4gTable
Стоит заметить, что использование глобальных переменных считается плохой практикой и не рекомендуется, поэтому решайте сами, стоит ли его применять.