Колба, как правильно загрузить CSV?

#python #csv #flask

Вопрос:

Я создаю приложение, в котором клиент загружает файл CSV, а сервер не хранит его, а только читает для выполнения задач и возвращает содержимое CSV в формате JSON.

Я проследил за некоторыми учебниками и постами и пришел к следующему коду:
Колба:

 @app.route('/analyse_dataset', methods=['GET','POST'])
def analyse_dataset_route():
    print('/analyse_dataset called', file=sys.stderr)
    try:

        # check if the post request has the dataset part
        if 'file' not in request.files:
            data = {'error': 'Dataset not in requested files'}
            return Response(data, status=400, mimetype='application/json')
        print('request.files : '   str(request.files))
        uploaded_file = request.files['file']

        # no dataset
        if uploaded_file.filename == '':
            logger.debug('Dataset not found, returning to /')
            return redirect('/')

        # dataset ok
        if uploaded_file:
            print('uploaded_file ok', file=sys.stderr)
            filename = secure_filename(uploaded_file.filename)
            #uploaded_file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

            uploaded_file.stream.seek(0) 
            myfile = uploaded_file.file 
            
            print('uploaded_file name: '   filename, file=sys.stderr)
            
            dataframe = pd.read_csv(myfile)
            return Response(dumps(dataframe), status=200, mimetype='application/json')
        else:
            data = {'error': 'Something went wrong...'}
            return Response(data, status=400, mimetype='application/json')
            
    except Exception as e:
        logger.error('An error occurred while analysing dataset')
        logger.error(e, exc_info=True)
        print(e)
        data = {'error': 'An error occurred while analysing dataset'}
        return Response(data, status=400, mimetype='application/json')

 

сторона клиента:

 onClickHandler = () => {
        if (this.state.selectedFile == null) {
            toast.error('No file selected')
        } else {
            const data = new FormData()
            data.append('file', this.state.selectedFile)
            let req = "http://localhost:5001/analyse_dataset"
            
            axios.post(req, data, {
                onUploadProgress: ProgressEvent => {
                    this.setState({
                        loaded: (ProgressEvent.loaded / ProgressEvent.total * 100),
                        loading: true
                    })
                },
            })
                .then(res => { // then print response status
                    console.log("file processed: "   res.data)
                    this.setState({
                        redirect: true,
                        jsondata: res.data
                    })
                })
                .catch(err => { // then print response status
                    console.log(err)
                    this.setState({
                        selectedFile: null,
                        loaded: 0,
                        loading: false
                    })
                    setTimeout(() => {
                        toast.error("Process failed, be sure to upload a correct file.")
                    }, 500)
                })
        }
    }
 

Таким образом, существует проблема, когда он «работает» с большим CSV-файлом, но не работает с меньшим, и я не могу понять, почему. Также я хотел бы вернуть клиенту JSON, содержащий каждую строку CSV, но на данный момент он не работает должным образом.

Вот в чем ошибка : введите описание изображения здесь

Ответ №1:

Ваш код, скорее всего, не работает myfile = uploaded_file.file . Попробуйте изменить строку на myfile = uploaded_file.stream .

Если вы используете Python 3, то для pandas.read_csv требуется текстовый файл/поток, т. е. Юникод. Преобразуйте поток, и он должен работать.

myfile = io.StringIO(myfile.getvalue().decode())

Как только у вас будет ваш pd.DataFrame объект, вы можете использовать pd.DataFrame.to_json для преобразования ваших файлов. Смотрите документы здесь.

Я не уверен, почему именно работают файлы большего размера.

Комментарии:

1. Привет, но я не использую Django , я использую Колбу

2. Это… совершенно верно! Я вернусь к этому как можно скорее!