Dash-大きいデータのcsvをダウンロードします

3338 ワード

前编ではデータをダウンロードする机能を実现しましたが、実际の使用中に2 Mを超えるデータがあれば、Googleブラウザの下でダウンロードに失败します.后で原因を调べてみましたが、一部のブラウザで制限されているurlの大きさのためです.
データURI制限データURI仕様ではサイズ制限は定義されていませんが、アプリケーションが自分のサイズを強要できることを示します.
  • Chrome-2MB
  • Firefox-無制限
  • IE≥9&Edge-4GB
  • SafariとモバイルSafari-?

  • では、データが大きい場合はどうすればいいのでしょうか.元の基礎の上で変更すればいいです.
    import dash
    import dash_core_components as dcc
    import dash_html_components as html
    import pandas as pd
    import urllib.parse as url_parse
    import flask #       
    from io import StringIO, BytesIO #                
     
    df = pd.DataFrame({
        'a': [1, 2, 3, 4],
        'b': [2, 1, 5, 6],
        'c': ['x', 'x', 'y', 'y']
    })
     
     
    def generate_table(dataframe, max_rows=10):
        return html.Table(
            # Header
            [html.Tr([html.Th(col) for col in dataframe.columns])] +
     
            # Body
            [html.Tr([
                html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
            ]) for i in range(min(len(dataframe), max_rows))]
        )
     
     
    app = dash.Dash(__name__)
    app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})
    app.layout = html.Div([
        html.Label('Filter'),
     
        dcc.Dropdown(
            id='field-dropdown',
            options=[
                {'label': i, 'value': i} for i in
                (['all'] + list(df['c'].unique()))],
            value='all'
        ),
        html.Div(id='table'),
        html.A(
            'Download Data',
            id='download-link',
            download="rawdata.csv",
            href="",
            target="_blank"
        )
    ])
     
     
    def filter_data(value):
        if value == 'all':
            return df
        else:
            return df[df['c'] == value]
     
     
    @app.callback(
        dash.dependencies.Output('table', 'children'),
        [dash.dependencies.Input('field-dropdown', 'value')])
    def update_table(filter_value):
        dff = filter_data(filter_value)
        return generate_table(dff)
     
     
    @app.callback(
        dash.dependencies.Output('download-link', 'href'),
        [dash.dependencies.Input('field-dropdown', 'value')])
    def update_download_link(filter_value):
        return f'/download?value={filter_value}' #        ,   ?a=1&b=2&c=3   
    
    @app.server.route('/download')
    def Download_csv():
        filter_value = flask.request.args.get('value')
        #        ,         , get('a'),get('b'),get('c')  
        dff = filter_data(filter_value) #     ,         
        strIO = StringIO()
        dff.to_csv(strIO, index=False, encoding='utf-8') #        
        mem = BytesIO() #       ,        StringIO,         
        mem.write(strIO.getvalue().encode('utf-8')) #     
        mem.seek(0)
        strIO.close()
        return flask.send_file(
            mem,
            mimetype='text/csv',
            attachment_filename=f'daily_user_{name}.csv',
            as_attachment=True
        )
     
     
    if __name__ == '__main__':
        app.run_server(debug=True)

    この方法でビッグデータをダウンロードできます.具体的にはどれだけダウンロードできますか.試したことはありませんが、数十兆以上のデータをダウンロードすることができます.
    また、別のダウンロード方法が見つかりました.
    https://github.com/plotly/dash-recipes/blob/master/dash-download-file-link-server.py
    参考までに~