【问题标题】:AttributeError: __enter__ while passing .xml via HTTP Post to pd.read_xml()AttributeError: __enter__ 同时通过 HTTP Post 将 .xml 传递给 pd.read_xml()
【发布时间】:2022-11-12 05:24:51
【问题描述】:

我正在使用 python pandas 和烧瓶来完成一些后处理任务(分析和可视化)。到目前为止,我通过 pd.read_csv、pd.read_xlsx 上传/读取 *.csv *.xlsx 和 *.xls。一切都很安静。

现在我有一个 *.xml 文件作为数据源,并根据我的习惯模式进行了尝试。

所以我尝试了:

<form action="/input" method="POST" enctype="multipart/form-data">
<input class="form-control" type="file"  name="file">
<input type="submit" class="btn btn-outline-secondary" name="Preview"  value ="Preview Data" > </input>

from flask import Flask, render_template,request, render_template
import pandas as pd
import xml.etree.ElementTree as ET

@app.route("/input", methods=['POST', 'GET'])
def input():
        if request.method == 'POST':
            if request.form['Preview'] == "Preview Data":
                file = request.files['file']
                filename = file.filename
                if '.xml' in filename:
                     content = pd.read_xml(file, parser='lxml')

但是当我通过表单将 .xml 文件传递​​给应用程序时。我得到错误:

File "C:\ProgramData\MiniforgeEnvs\TestEnv\lib\site-packages\pandas\io\xml.py", line 627, in _parse_doc
    with preprocess_data(handle_data) as xml_data:
AttributeError: __enter__

我尝试检查不同的选项:

  1. 当我使用 inbuild xml.etree 包时,它工作正常:
    import xml.etree.ElementTree as ET
    
    if '.xml' in filename:
        tree = ET.parse(file)
        root = tree.getroot()  
        print(root[1][0][1].attrib)
    
    
    
    1. 当我将 .xml 直接从应用程序目录加载到 pd.read_xml() 时,它也能正常工作:
    if '.xml' in filename:
        
        content = pd.read_xml('SampleExport.xml', parser='lxml')
    
    1. 我尝试了不同的 prasers:“lxml”和“etree”

    但是最后,当我通过 Form/input 传递 .xml 并使用 pd.read_xml(file,parser='lxml') 时,我从上面得到了错误。

【问题讨论】:

    标签: python pandas xml flask attributeerror


    【解决方案1】:

    我刚刚解决了我的问题,尽管我不太确定为什么 pd.read_xml() 与 pd.read_csv() 或 pd.read_xlsx() 相比表现不同。

    pd.read_xml 是不是能够读取 FileStorage 对象。 request.file[] 传递的变量是类的一个实例:werkzeug.datastructures.FileStorage(stream=None, filename=None, name=None, content_type=None, content_length=None, headers=None)。

    通过读取功能,我提取了文件本身。

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

    将此传递给 pr.read_xml 它工作正常。

    有没有人可以解释为什么 pd.read_xml() 的 _parse_doc() 函数无法读取 FileStotage 类型?

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多