尝试使用FastAPI和python-docx库读取docx文件:AttributeError:'bytes'对象没有属性'seek'错误

问题描述

我正在使用FastAPI(不是异步)和python-docx库,试图读取docx文件。 尝试读取docx文件时出现错误

我的代码-

@app.post('/translate_docx',response_class=PlainTextResponse)
def translateDocx(docFile: UploadFile = File(...),fileExtension: str = Form(...)):
 
    if(fileExtension == 'docx'):
        raw_txt = readDocx(docFile.file.read())

    return raw_txt


def readDocx(file):
    doc = Document(file)
    txt = ""
    for para in doc.paragraphs:
        txt = txt + para.text
    return txt

日志:

File "/translateProject/.venv/lib/python3.7/site-packages/docx/opc/pkgreader.py",line 32,in from_file
    phys_reader = PhysPkgReader(pkg_file)
  File "/translateProject/.venv/lib/python3.7/site-packages/docx/opc/phys_pkg.py",line 101,in __init__
    self._zipf = ZipFile(pkg_file,'r')
    
  File "/usr/lib/python3.7/zipfile.py",line 1258,in __init__
    self._RealGetContents()
    
  File "/usr/lib/python3.7/zipfile.py",line 1321,in _RealGetContents
    endrec = _EndRecData(fp)
  File "/usr/lib/python3.7/zipfile.py",line 259,in _EndRecData
    fpin.seek(0,2)
    
AttributeError: 'bytes' object has no attribute 'seek'

我的代码有什么问题?任何帮助都会有所帮助。

解决方法

不要.read()分配给Document()的文件。只需为其提供文件名,或者您可以为其提供一个打开的文件,该文件的游标设置在偏移量0上。如果您拥有的“文件”已经是字节对象,则可以使用io.BytesIO“内存中”文件给Document()

docx_file中的Document(docx_file)参数可以是str的文件路径,也可以是类似文件的对象(使用open(...)创建的打开文件或内存中的文件io.BytesIO创建的文件,但不能是bytes对象(file.read()返回的对象)。