Я пытаюсь создать графический интерфейс, где пользователь может загрузить CSV-файл без заголовков и загрузить отдельный текстовый файл, который содержит заголовок.Файл CSV будет показан в таблице, и когда текстовый файл будет выбран и загружен, заголовки столбцов таблицы данных будут заменены на заголовки столбцов, содержащиеся в текстовом файле.
Я пробовал дваСпособы сделать это: во-первых, иметь div в app.layout и иметь функцию обратного вызова, возвращающую данные этому div.Используя этот метод, таблица данных загружается корректно, но я не могу понять, как ссылаться и изменять столбцы этой таблицы.
Второй способ - иметь пустую таблицу в app.layout и иметь обратный вызовфункция возвращает данные с помощью панд to_dict ().С помощью этого метода я могу ссылаться на таблицу по ее идентификатору и изменять ее столбцы.Тем не менее, когда я запускаю функцию обратного вызова, результирующая таблица данных остается пустой (хотя число строк кажется правильным).
Это app.layout
app.layout = html.Div([
html.H1('Upload File'),
dcc.Upload(
id ='upload_data',
children = html.Button('Select Data File',
id = 'load_data_button')
),
html.H2('Upload Headers'),
dcc.Upload(
id ='upload_headers',
children = html.Button('Select Headers File',
id = 'load_header_button')
),
html.Div(id = 'my_headers'),
html.Div(id = 'my_data'),
html.Div(
dash_table.DataTable(
id = 'load_data_table'
)
)
])
Хотя этообратный вызов в вопросе
@app.callback(
Output('load_data_table', 'data'),
[Input('upload_data', 'contents')]
)
def update_table(content):
if content is not None:
content_type, content_string = content.split(',')
decoded = base64.b64decode(content_string)
df = pd.read_csv(io.BytesIO(decoded), header = None)
return df.to_dict('records')
else:
return [{}]
Это код для второго метода, который я упомянул.Как показано, исходные данные таблицы не установлены, а выходные данные отображаются на данные таблицы.
Я ожидал, что данные появятся в таблице, но на самом деле происходит то, что ячейки таблицы пустые.Тем не менее, количество строк является правильным (то есть, если мой CSV 5 строк, он генерирует 5 строк пустых ячеек), что заставляет меня думать, что что-то посылается через обратный вызов, по крайней мере.
Кто-нибудь знает, как исправить два упомянутых мною метода, или знает о лучшем методе для выполнения этой задачи?