使用Python Flask上传CSV文件并进行处理

时间:2019-03-20 04:59:59

标签: python csv python-3.6 flask-restful

我有以下代码,可以使用Python FLASK上传CSV文件。

from flask_restful import Resource
import pandas as pd

ROOT_PATH = os.path.dirname(os.path.abspath(__file__))

class UploadCSV(Resource):

    def post(self):
        files = request.files['file']
        files.save(os.path.join(ROOT_PATH,files.filename))
        data = pd.read_csv(os.path.join(ROOT_PATH,files.filename))
        print(data)

api.add_resource(UploadCSV, '/v1/upload')

if __name__ == '__main__':
    app.run(host='localhost', debug=True, port=5000)

此代码工作正常,我可以成功上传CSV文件并使用pandas数据框读取它。但是我将csv保存在本地文件系统中并读取它。

我尝试过阅读如下内容-

files = request.files['file']
files.read()

获得的结果是字节格式,但我需要字典格式。因此,我使用了pandas数据框来读取它,后来将其转换为自己格式的自定义词典。

是否可以在不将其写入本地文件系统的情况下即时读取CSV文件?还是我们可以使用Python Flask Restful实现的任何等效方法?

1 个答案:

答案 0 :(得分:1)

(由于它是一个文件,所以命名不太恰当)# import the necessary packages from __future__ import print_function from imutils.video import VideoStream import argparse import imutils import time import cv2 import RPi.GPIO as GPIO # initialize GPIO redLed = 21 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(redLed, GPIO.OUT) # construct the argument parse and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-p", "--picamera", type=int, default=-1, help="whether or not the Raspberry Pi camera should be used") args = vars(ap.parse_args()) # initialize the video stream and allow the camera sensor to warmup print("[INFO] waiting for camera to warmup...") vs = VideoStream(usePiCamera=args["picamera"] > 0).start() time.sleep(2.0) # define the lower and upper boundaries of the object # to be detected in the HSV color space colorLower = (24, 100, 100) colorUpper = (44, 255, 255) # Start with LED off print("\n Starting..... ==> Press 'q' to quit Program \n") GPIO.output(redLed, GPIO.LOW) ledOn = False # loop over the frames from the video stream while True: # grab the next frame from the video stream, Invert 180o, resize the # frame, and convert it to the HSV color space frame = vs.read() frame = imutils.resize(frame, width=500) frame = imutils.rotate(frame, angle=180) hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # construct a mask for the obect color, then perform # a series of dilations and erosions to remove any small # blobs left in the mask mask = cv2.inRange(hsv, colorLower, colorUpper) mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) # find contours in the mask and initialize the current # (x, y) center of the object cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1] center = None #print("hey") if cnts is None: cnts = [] # only proceed if at least one contour was found if len(cnts) > 0: # find the largest contour in the mask, then use # it to compute the minimum enclosing circle and # centroid c = max(cnts, key=cv2.contourArea) ((x, y), radius) = cv2.minEnclosingCircle(c) M = cv2.moments(c) center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # only proceed if the radius meets a minimum size if radius > 10: # draw the circle and centroid on the frame, # then update the list of tracked points cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1) # if the led is not already on, turn the LED on if not ledOn: GPIO.output(redLed, GPIO.HIGH) ledOn = True print("fined") # if the object is not detected, turn the LED off elif ledOn: GPIO.output(redLed, GPIO.LOW) ledOn = False # show the frame to our screen cv2.imshow("Frame", frame) key = cv2.waitKey(1) & 0xFF # if the 'q' key is pressed, stop the loop if key == ord("q"): break # do a bit of cleanup print("\n Exiting Program and cleanup stuff \n") GPIO.cleanup() cv2.destroyAllWindows() vs.stop()变量包含一个werkzeug.datastructures.FileStorage对象。这是一个类似于对象的文件(包含files方法),因此有可能直接将其用作read()的输入,如pandas documentation所示。

因此,不保存到磁盘的解决方案很简单:

pandas.read_csv()