Глобальная переменная не определена на уровне модуля - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть эта программа, которая работает, она читает в простой CSV-файл, фильтрует столбец в этом файле для цветов. Затем записывает CSV-файл для каждого цвета отдельно. Затем строит график сравнения столбцов для каждого из отфильтрованных выходных файлов. Но он все еще работает с некоторыми ошибками

Я уже писал этот вопрос, но все еще возникают проблемы. Если кто-нибудь может помочь с моим плохим кодом! Мои вопросы

Я не понимаю, почему я получаю «именованную переменную col_number undefined» (строка 58), когда мне пришлось определить ее дважды. Я знаю, что это плохой код, но если кто-то может помочь мне с этим.

Кроме того, я пытаюсь передать user_input (в этом случае яблоки, груши или апельсины должны быть заголовком оси Y при запуске программы Я попытался включить в после оператора col_number в операторе возврата и изменить тег данных в plt.title ('Data v Time') на plt.title (user_input + 'v Time'), но ссылка на сообщение неразрешена.

благодарен за любую помощь, мой код ниже

from matplotlib import style
from matplotlib import pyplot as plt
import numpy as np
import csv
# import random used for changing line colors in chart
import random
from itertools import cycle

# opens a the input file and reads in the data
with open('Test_colours_in.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
# prints list of unique values in column 5 of csv of input file
    my_list = set()
    for line in csv_reader:
        my_list.add(line['Name5'])
    print(my_list)

# takes these unique values and creates files associated with each unique value
    for item in my_list:
        with open(item + '_'+'Test.csv', 'w', newline='') as new_file:
            fieldnames = ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6', 'Name7', 'Name8']
            csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames)
            csv_writer.writeheader()

# filters the original file for each item in the list of unique values and writes them to respective file
            csv_file.seek(0)  # Reposition to front of file
            filtered = filter(lambda r: r['Name5'] == item, csv_reader)
            for row in filtered:
                csv_writer.writerow(row)

# Section of code below plots data from each of the filtered files

#
    my_color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'tab:blue', 'tab:orange', 'tab:purple', 'tab:gray', 'b', 'g', 'r',
                     'c', 'm', 'y', 'tab:blue', 'tab:orange', 'tab:purple', 'tab:gray']

# ###################################################################
# ## trying to get this to do the same as the current input commands
    #global col_number
    def get_input(prompt):
        global col_number
        while True:
            user_input = input(prompt).lower()
            if user_input in ('apples', 'pears', 'oranges', 'quit'):
    # the user = int(0),int(1), int(2) values just assign a different column numnber
                if user_input == 'apples':
                    col_number = int(0)
                if user_input == 'pears':
                    col_number = int(1)
                if user_input == 'oranges':
                    col_number = int(2)
                return col_number,
print(get_input('Enter apples, pears, oranges or q to quit'))
# ######end of input#########################################################################col_number = get_input(prompt)

for item in my_list:

    x, y = np.loadtxt(item + '_'+'Test.csv', skiprows=1, usecols=[0, col_number], unpack=True, delimiter=',')
    color = random.choice(my_color_list)
    plt.plot(x, y, color, label=item, linewidth=5)

    style.use('ggplot')

plt.title('Data v Time')
plt.ylabel('Data')
plt.xlabel('Time seconds')

plt.legend()
plt.grid(True, color='k')
plt.show()

файл данных ниже

Имя1, Имя2, Имя3, Имя4, Имя5, Имя6, Имя7, Имя8 1,10,19, 4, синий, 6,7,8 2,11,20,4, синий, 6,7,8 3,12,21,4, синий, 6,7,8 4,13,22,4, зеленый, 6 7,8 5,14,23,4, Зеленый, 6,7,8 6,15,24,4, Синий, 6,7,8 7,16,25,4, Синий, 6,7,8 8 , 17,26,4, желтый, 6,7,8 9,18,27,4, желтый, 6,7,8

1 Ответ

0 голосов
/ 07 апреля 2020

Для решения вашей конкретной проблемы c, col_number не обязательно должен быть глобальным. Посмотрите, что вы делаете:

def get_input(prompt):
    global col_number
                col_number = ...
            return col_number,

Вы вообще не используете (неустановленное) значение col_number, вы просто устанавливаете его. И после установки вы возвращаете то же значение!

Так что забудьте о наличии глобальной переменной. Просто присвойте col_number результату вашей функции:

def get_input(...):
    result = ...
    return result

# elsewhere in your code:
col_number = get_input(...)
... use col_number ...
...