首页 > 编程问答 >Python Pandas - 读取 CSV 或 Excel

Python Pandas - 读取 CSV 或 Excel

时间:2024-07-21 06:17:31浏览次数:10  
标签:python python-3.x pandas

我允许用户上传 CSV 或 Excel 文件。我正在使用 pandas 读取文件并创建数据框。由于我无法预测用户将上传哪种文件类型,因此我将 pd.read_csv() 和 pd.read_excel() 包装在 try/ except 块中。

if form.validate_on_submit():
    input_filename = secure_filename(form.file.data.filename)
    try:
        df = pd.read_csv(form.file.data, header=0, skip_blank_lines=True, skipinitialspace=True, encoding='latin-1')
    except:
        df = pd.read_excel(form.file.data, header=0, skip_blank_lines=True, skipinitialspace=True, encoding='latin-1')

如果 pd.read_csv() 位于 try/ except 块中的第一个我上传了一个 .csv 文件,它可以工作。如果我尝试上传 .xlsx 文件,则会收到此错误:

TypeError: expected str, bytes or os.PathLike object, not NoneType

如果 pd.read_excel() 位于 try/ except 块中的第一个并且我上传 .xlsx 文件,则它可以工作。如果我尝试上传 .csv 文件,则会收到此错误:

pandas.io.common.EmptyDataError: No columns to parse from file

以前,我使用 mimetype 将文件路由到正确的 pandas 函数,但我希望有一个更干净(且包罗万象)的解决方案,但没有涉及多个 if/elif 语句。这就是我的:

if form.file.data.mimetype == 'text/csv':
    df = pd.read_csv(form.file.data, header=0, skip_blank_lines=True, skipinitialspace=True, encoding='latin-1')
elif form.file.data.mimetype == 'application/octet-stream':
    df = pd.read_excel(form.file.data, header=0, skip_blank_lines=True, skipinitialspace=True, encoding='latin-1')
elif form.file.data.mimetype == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
    df = pd.read_excel(form.file.data, header=0, skip_blank_lines=True, skipinitialspace=True, encoding='latin-1')
else:
    flash('Error Uploading File. Invalid file type. Please use xls, xlsx or csv.', 'danger')
    return render_template('upload.html', current_user=current_user, form=form)

我正在使用 Flask、WTForms 和 Python 3。谢谢。


的尝试/异常方法的问题在于,不处理引发异常的特定异常类型。引发 TypeError EmptyDataError 可能有很多原因,并且盲目地尝试其他函数可能并不总是合适的解决方案。

这是一个更强大的解决方案,它首先保存上传的文件,然后根据文件扩展名使用适当的 Pandas 函数:

import os
from werkzeug.utils import secure_filename

ALLOWED_EXTENSIONS = {'csv', 'xlsx', 'xls'}

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    form = UploadForm()
    if form.validate_on_submit():
        file = form.file.data
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(filepath)

            try:
                if filename.endswith('.csv'):
                    df = pd.read_csv(filepath, header=0, skip_blank_lines=True, skipinitialspace=True, encoding='latin-1')
                elif filename.endswith(('.xlsx', '.xls')):
                    df = pd.read_excel(filepath, header=0, skip_blank_lines=True, skipinitialspace=True, encoding='latin-1')
                else:
                    flash('文件类型不受支持。', 'danger')
                    return redirect(request.url)

                # 在此处处理数据框 (df)

            except Exception as e:
                flash(f'上传文件时出错:{e}', 'danger')
                return redirect(request.url)

            return redirect(url_for('success'))

        else:
            flash('文件类型无效。请使用 xls、xlsx 或 csv。', 'danger')
    return render_template('upload.html', form=form)

说明:

  1. 允许的文件: 使用集合 ALLOWED_EXTENSIONS 定义允许的文件扩展名,以提高安全性。
  2. 辅助函数 allowed_file 此函数检查上传的文件名是否具有允许的扩展名。
  3. 保存文件: 上传的文件首先使用 file.save(filepath) 保存到服务器。
  4. 基于扩展名的处理: 文件保存后,代码会检查文件扩展名,并使用 pd.read_csv() pd.read_excel() 来读取文件。
  5. 错误处理: try...except 块捕获文件读取过程中可能发生的任何错误,并向用户显示消息。

此方法比仅依赖异常处理更可靠、更安全,因为它可以确保使用正确的方法来读取文件,并且不会意外地尝试使用错误的函数读取无效文件。

标签:python,python-3.x,pandas
From: 41747970

相关文章

  • 如何在 python 脚本中调用 robocopy 来批量复制多个文件夹?
    我正在尝试在网络驱动器之间移动多个大文件夹(>10Gb、>100个子文件夹、>2000个文件)。我尝试过在python中使用Shutil.copytree命令,它工作得很好,只是由于不同的原因它无法复制一小部分(<1%的文件)。我相信robocopy对我来说是最好的选择,因为我可以创建一个记录传输过......
  • 如何在Python中使用装饰器动态创建类方法?
    我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:装饰器应该从外部配置(例如字典)读取方法定义。装饰器应该动态地将这些方法添加到类中。每个生成的方法都应具有配置中指定的自己唯一的实现。以......
  • python 中的可扩展视频文件完整性验证
    我的目录包含约100万个视频文件,嵌套在100个子目录下。我想编写一个python脚本来验证这些文件没有损坏,然后删除损坏的文件。做到这一点最有效的方法是什么?它运行的机器有64个cpu核心。当然,以下是如何在Python中构建可扩展视频文件完整性验证器的步骤,该验证器可以......
  • Python:对很高维的矩阵进行对角化?
    目前我正在研究一个涉及对角化矩阵以获得特征值和特征向量的问题。但现在我想将问题扩展到200,000x200,000的尺寸。我查找了如何将矩阵存储在numpy中,有人建议使用PyTables。看起来很有希望。但我想知道哪里有工具可以帮助对PyTables中的矩阵存储进行对角化。......
  • 除了curses之外,是否有一个python包可以轻松控制终端的输出?
    我现在正在处理一些小项目,我对GUI的偏好是终端中漂亮的文本界面。我宁愿不强迫用户处理Windowscurses二进制文件,所以我正在寻找不同的选项。我已经发现了asciimatics,但我想考虑所有可能的选择。如果有人有任何经验或知道解决此用例的包,我将不胜感激。谢谢你说的没错......
  • 当值来自函数 python unittest 时,如何模拟全局变量
    我必须在python中模拟全局变量,但变量值来自另一个函数。当我导入文件时,这个函数正在运行,但我想要那里的模拟值。secrets.pyimporttracebackimportloggingimportboto3importosimportjsonlogger=logging.getLogger()logger.setLevel(logging.INFO)secret_......
  • 使用 python print 和 gdb 时出现 BrokenPipeError
    我正在尝试在Linux中运行应用程序并使用Python生成输入:python3-c'print(".....")'|./someapp但出现下一个错误:Exceptionignoredin:<_io.TextIOWrappername='<stdout>'mode='w'encoding='utf-8'>BrokenPipeError:......
  • python 舰队容器
    我正在尝试使用容器在flet中制作一个菜单,它应该是半透明的,但其中的项目不是。我尝试将opacity=1分配给元素,但没有成功-它们与容器一样透明感谢任何帮助我的代码:nickname=ft.TextField(label="xxx",hint_text="xxx")column=ft.Column(controls=[nickname......
  • Python应用程序跨子包共享的配置文件
    我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:name_of_my_app/__init__.pymain.pyconfig.iniCONFIG.pymotors/__init__.pyone_kind_of_motor.pymeasurement_devices/......
  • python中时间序列数据的梯度计算
    我正在尝试编写一个函数,它可以从最适合下面的线返回梯度dataframe在浏览了谷歌的几个资源之后,我仍然不确定这是如何完成的。我明白最佳拟合线的计算公式为:y=mx+b将因变量(y)设置为foos,将自变量(x)设置为DateTimeDatafram......