javascript - تحميل ملف كسف وقراءته في بوك الويب التطبيق




python file (2)

لدي خوخه بالتآمر التطبيق، وأنا بحاجة للسماح للمستخدم لتحميل ملف كسف وتعديل المؤامرات وفقا للبيانات في ذلك. هل من الممكن القيام بذلك مع الحاجيات المتاحة من خوخه؟ شكرا جزيلا.


بقدر ما أعرف أنه لا يوجد القطعة الأصلية إلى خوخه من شأنها أن تسمح تحميل الملف.

سيكون من المفيد لو كنت قد توضح الإعداد الحالي الخاص بك أكثر قليلا. هي المؤامرات الخاصة بك تعمل على خادم خوخه أو فقط من خلال النصي بيثون أن يولد المؤامرات؟

عموما على الرغم من ذلك، إذا كنت بحاجة إلى هذا أن يتعرض من خلال متصفح عليك على الأرجح تريد شيئا مثل قارورة تشغيل الصفحة التي تتيح للمستخدم تحميل ملف إلى الدليل الذي النصي خوخه يمكن بعد ذلك قراءة والمؤامرة.


على الرغم من عدم وجود القطعة بوك الأصلي لإدخال الملف. فمن الممكن جدا لتوسيع الأدوات الحالية التي تقدمها بوك. هذه الإجابة سوف محاولة لإرشادك من خلال خطوات إنشاء القطعة المخصصة وتعديل جافاسكريبت خوخه لقراءة وتحليل وإخراج الملف.

أولا على الرغم من الكثير من الفضل يذهب إلى الإجابة بيغريدوت السابقة على إنشاء القطعة. أنا ببساطة تمديد كوفسكريبت في جوابه لإضافة وظيفة التعامل مع الملف.

الآن نبدأ من خلال إنشاء فئة خوخه جديدة على الثعبان التي سوف تصل إلى فئة جافا سكريبت وعقد المعلومات الناتجة عن إدخال الملف.

models.py

from bokeh.core.properties import List, String, Dict, Int
from bokeh.models import LayoutDOM

class FileInput(LayoutDOM):
__implementation__ = 'static/js/extensions_file_input.coffee'
__javascript__ = './input_widget/static/js/papaparse.js'

value = String(help="""
Selected input file.
""")

file_name = String(help="""
Name of the input file.
""")

accept = String(help="""
Character string of accepted file types for the input. This should be
written like normal html.
""")

data = List(Dict(keys_type=String, values_type=Int), default=[], help="""
List of dictionary containing the inputed data. This the output of the parser.
""")

ثم نقوم بإنشاء تنفيذ كوفسكريبت لطبقة جديدة بيثون لدينا. في هذه الفئة الجديدة، هناك وظيفة معالج ملف المضافة التي تؤدي على تغيير القطعة إدخال الملف. يستخدم معالج الملفات هذا بابابارس لتحليل كسف ثم يحفظ النتيجة في خاصية بيانات الفئة. يمكن تحميل جافاسكريبت لبابابارس على موقعه على الانترنت.

يمكنك توسيع وتعديل المحلل للتطبيق المطلوب وتنسيق البيانات.

extensions_file_input.coffee

import * as p from "core/properties"
import {WidgetBox, WidgetBoxView} from "models/layouts/widget_box"

export class FileInputView extends WidgetBoxView

  initialize: (options) ->
    super(options)
    input = document.createElement("input")
    input.type = "file"
    input.accept = @model.accept
    input.id = @model.id
    input.style = "width:" + @model.width + "px"
    input.onchange = () =>
      @model.value = input.value
      @model.file_name = input.files[0].name
      @file_handler(input)
    @el.appendChild(input)

  file_handler: (input) ->
    file = input.files[0]
    opts =  
      header: true,
      dynamicTyping: true,
      delimiter: ",",
      newline: "\r\n",
      complete: (results) =>
        input.data = results.data
        @.model.data = results.data
    Papa.parse(file, opts)


export class FileInput extends WidgetBox
  default_view: FileInputView
  type: "FileInput"
  @define {
    value: [ p.String ]
    file_name: [ p.String ]
    accept: [ p.String ]
    data : [ p.Array ]
  }

A مرة أخرى على الجانب الثعبان يمكننا بعد ذلك إرفاق بوك on_change إلى فئة المدخلات الجديدة لدينا لتحريك عندما تكون تغييرات البيانات البيانات. سيحدث هذا بعد تحليل كسف. يعرض هذا المثال التفاعل المطلوب.

main.py

from bokeh.core.properties import List, String, Dict, Int
from bokeh.models import LayoutDOM

from bokeh.layouts import column
from bokeh.models import Button, ColumnDataSource
from bokeh.io import curdoc
from bokeh.plotting import Figure

import pandas as pd

from models import FileInput

# Starting data
x = [1, 2, 3, 4]
y = x

source = ColumnDataSource(data=dict(x=x, y=y))

plot = Figure(plot_width=400, plot_height=400)
plot.circle('x', 'y', source=source, color="navy", alpha=0.5, size=20)

button_input = FileInput(id="fileSelect",
                         accept=".csv")


def change_plot_data(attr, old, new):
    new_df = pd.DataFrame(new)
    source.data = source.from_df(new_df[['x', 'y']])


button_input.on_change('data', change_plot_data)

layout = column(plot, button_input)
curdoc().add_root(layout)

مثال على ملف .csv لهذا التطبيق سيكون. تأكد من عدم وجود خط إضافي في نهاية كسف.

x,y
0,2
2,3
6,4
7,5
10,25

لتشغيل هذا المثال بشكل صحيح، يجب تعيين خوخه في انها مناسبة شكل شجرة ملف التطبيق.

input_widget
   |
   +---main.py
   +---models.py
   +---static
        +---js
            +--- extensions_file_input.coffee
            +--- papaparse.js

لتشغيل هذا المثال، تحتاج إلى أن تكون في الدليل فوق أعلى معظم ملف وتنفيذ bokeh serve input_widget في المحطة.





bokeh