【问题标题】:I can not read uploaded csv file in FastAPI我无法在 FastAPI 中读取上传的 csv 文件
【发布时间】:2020-09-13 06:57:14
【问题描述】:

我正在尝试遍历 csv 文件。但是,收到的文件很难阅读。我搜索了这个,我找不到明确的解决方案!

@app.get("/uploadsequence/")
async def upload_sequence_form():
    return HTMLResponse("""
            <!DOCTYPE html>
            <html>
                <head>
                    <title>sequence upload</title>
                </head>
                <body>
                    <h1>upload sequence .CSV file</h1>
                    <form method='post' action='/uploadsequence/' enctype='multipart/form-data'>
                        Upload a csv file: <input type='file' name='csv_file'>
                        <input type='submit' value='Upload'>
                    </form>
                </body>
            </html>
            """)

@app.post("/uploadsequence/")
async def upload_sequence(csv_file: UploadFile = File(...), db = Depends(get_db)):
        csv_file_encoded = TextIOWrapper(csv_file.file, encoding='utf-8')
        csv_reader = csv.DictReader(csv_file_encoded)
        for row in csv_reader:
            if row["Well Type"] in ["RIG MAINTENANCE","RIG MOVE","RIG COMMISSIONING","ABANDONMENT","LEARNINGCURVE"]:
                crud.insert_sequence_record(db=db, row=row,is_drilling=False)
            else:
                crud.insert_sequence_record(db=db, row=row,is_drilling=True)

它给了我这个错误: csv_file_encoded = TextIOWrapper(csv_file.file, encoding='utf-8') AttributeError: 'SpooledTemporaryFile' object has no attribute 'readable'

我把UploadFile改成了bytes

@app.post("/uploadsequence/")
async def upload_sequence(csv_file: bytes = File(...), db = Depends(get_db)):
        csv_file_encoded = TextIOWrapper(csv_file, encoding='utf-8')
        csv_reader = csv.DictReader(csv_file_encoded)
        for row in csv_reader:
            if row["Well Type"] in ["RIG MAINTENANCE","RIG MOVE","RIG COMMISSIONING","ABANDONMENT","LEARNINGCURVE"]:
                crud.insert_sequence_record(db=db, row=row,is_drilling=False)
            else:
                crud.insert_sequence_record(db=db, row=row,is_drilling=True)

它给出了这个错误:csv_file_encoded = TextIOWrapper(csv_file, encoding='utf-8') AttributeError: 'bytes' object has no attribute 'readable'

我摆脱了编码:

@app.post("/uploadsequence/")
async def upload_sequence(csv_file: bytes = File(...), db = Depends(get_db)):
        # csv_file_encoded = TextIOWrapper(csv_file, encoding='utf-8')
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            if row["Well Type"] in ["RIG MAINTENANCE","RIG MOVE","RIG COMMISSIONING","ABANDONMENT","LEARNINGCURVE"]:
                crud.insert_sequence_record(db=db, row=row,is_drilling=False)
            else:
                crud.insert_sequence_record(db=db, row=row,is_drilling=True)

它给出了这个错误: self._fieldnames = next(self.reader) _csv.Error: iterator should return strings, not int (did you open the file in text mode?)

【问题讨论】:

  • 在第一种情况下,您只需拥有一个可以用作经典文件的 File 对象。在第二种情况下,您有原始字节。因此,您无法从已有的文件中打开文件,也无法通过传递字节来打开文件。您可以尝试在假脱机文件上使用DictReader,而不是字节

标签: python csv fastapi


【解决方案1】:

我使用以下内容读取 csv 文件。 codecs.iterdecode 为我工作。

csv_reader = csv.reader(codecs.iterdecode(csv_file.file,'utf-8'))

【讨论】:

  • @Sören 这是一个标准的python库
【解决方案2】:
@app.post("/submitform")
async def handle_form(assignment_file: UploadFile = File(...)):
   print(assignment_file.filename)
   csv_reader = pd.read_csv(assignment_file.file)
   
   print(csv_reader)
   //else return response
   // csv data will be stored in the csv_reader

【讨论】:

  • 我认为这是使用 pandas 的方法会比使用标准库慢
  • 如何在不上传 CSV 而是直接从 Python 读取路径的情况下做到这一点?
  • 我只需要那个 assignment_file.file 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多