#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. Это… совершенно верно! Я вернусь к этому как можно скорее!