【问题标题】:Export & Map CSV output to MySQL table using Python使用 Python 将 CSV 输出导出并映射到 MySQL 表
【发布时间】:2014-06-11 14:41:37
【问题描述】:

我有多个客户端到单个服务器的双向 iperf 设置,用于网络监控。 iperf 服务器运行良好,并根据客户端编写的 cron 作业以 CSV 格式显示输出。

我希望编写一个 python 脚本来自动化将这些 CSV 输出映射到 MySQL 数据库的过程;反过来,它会定期更新和保存,无需人工干预。

我使用 Ubuntu 13.10 机器作为 iperf 服务器。以下是我得到的示例 CSV 输出。这不会存储到文件中,只是显示在屏幕上。

s1:~$ iperf -s -y C  
20140422105054,172.16.10.76,41065,172.16.10.65,5001,6,0.0-20.0,73138176,29215083
20140422105054,172.16.10.76,5001,172.16.10.65,56254,4,0.0-20.0,46350336,18502933
20140422105100,172.16.10.76,54550,172.16.10.50,5001,8,0.0-20.0,67895296,27129408
20140422105100,172.16.10.76,5001,172.16.10.50,58447,5,0.0-20.1,50937856,20292796
20140422105553,172.16.10.76,5001,172.16.10.65,47382,7,0.0-20.1,51118080,20358083
20140422105553,172.16.10.76,41067,172.16.10.65,5001,5,0.0-20.1,76677120,30524007
20140422105600,172.16.10.76,5001,172.16.10.50,40734,4,0.0-20.0,57606144,23001066
20140422105600,172.16.10.76,54552,172.16.10.50,5001,8,0.0-20.0,70123520,28019115
20140422110053,172.16.10.76,41070,172.16.10.65,5001,5,0.0-20.1,63438848,25284066
20140422110053,172.16.10.76,5001,172.16.10.65,46462,6,0.0-20.1,11321344,4497094

我想将它们映射到的字段是:timestamp、server_ip、server_port、client_ip、client_port、tag_id、interval、transferred、bandwidth

我想定期将此 CSV 输出映射到 MySQL 数据库,为此我明白我必须编写 Python 脚本(在 cron 作业中)查询并存储在 MySQL 数据库中。我是 Python 脚本和数据库查询的初学者。

我在 [https://serverfault.com/questions/566737/iperf-csv-output-format]; 进行了另一个关于服务器故障的讨论;并希望以此为基础构建我的查询。

【问题讨论】:

    标签: python mysql csv cron iperf


    【解决方案1】:

    生成 SQL 脚本,然后运行它

    如果您不想使用像sqlalchemy 这样的复杂解决方案,可以使用以下方法。

    1. 拥有您的 csv 数据,将它们转换为 SQL 脚本
    2. 使用mysql命令行工具运行此脚本

    在你第一次做之前,确保你在数据库中创建了需要的数据库结构(这个我留给你)。

    我的以下示例使用(只是为了方便)包docopt,因此您需要安装它:

    $ pip install docopt
    

    CSV 到 SQL 脚本转换实用程序

    csv2sql.py:

    """
    Usage:
        csv2sql.py [--table <tablename>] <csvfile>
    
    Options:
        --table <tablename>  Name of table in database to import into [default: mytable]
    
    Convert csv file with iperf data into sql script for importing
    those data into MySQL database.
    """
    from csv import DictReader
    from docopt import docopt
    
    if __name__ == "__main__":
        args = docopt(__doc__)
        fname = args["<csvfile>"]
        tablename = args["--table"]
        headers = ["timestamp",
                   "server_ip",
                   "server_port",
                   "client_ip",
                   "client_port",
                   "tag_id",
                   "interval",
                   "transferred",
                   "bandwidth"
                  ]
        sql = """insert into {tablename}
        values ({timestamp},"{server_ip}",{server_port},"{client_ip}",{client_port},{tag_id},"{interval}",{transferred},{bandwidth});"""
        with open(fname) as f:
            reader = DictReader(f, headers, delimiter=",")
            for rec in reader:
                print(sql.format(tablename=tablename, **rec)) # python <= 2.6 will fail here
    

    将 CSV 转换为 SQL 脚本

    首先介绍一下转换工具:

    $ python csv2sql.py -h
    Usage:
        csv2sql.py [--table <tablename>] <csvfile>
    
    Options:
        --table <tablename>  Name of table in database to import into [default: mytable]
    
    Convert csv file with iperf data into sql script for importing
    those data into MySQL database.
    

    将您的数据保存在文件data.csv

    $ python csv2sql.py data.csv 
    insert into mytable
        values (20140422105054,"172.16.10.76",41065,"172.16.10.65",5001,6,"0.0-20.0",73138176,29215083);
    insert into mytable
        values (20140422105054,"172.16.10.76",5001,"172.16.10.65",56254,4,"0.0-20.0",46350336,18502933);
    insert into mytable
        values (20140422105100,"172.16.10.76",54550,"172.16.10.50",5001,8,"0.0-20.0",67895296,27129408);
    insert into mytable
        values (20140422105100,"172.16.10.76",5001,"172.16.10.50",58447,5,"0.0-20.1",50937856,20292796);
    insert into mytable
        values (20140422105553,"172.16.10.76",5001,"172.16.10.65",47382,7,"0.0-20.1",51118080,20358083);
    insert into mytable
        values (20140422105553,"172.16.10.76",41067,"172.16.10.65",5001,5,"0.0-20.1",76677120,30524007);
    insert into mytable
        values (20140422105600,"172.16.10.76",5001,"172.16.10.50",40734,4,"0.0-20.0",57606144,23001066);
    insert into mytable
        values (20140422105600,"172.16.10.76",54552,"172.16.10.50",5001,8,"0.0-20.0",70123520,28019115);
    insert into mytable
        values (20140422110053,"172.16.10.76",41070,"172.16.10.65",5001,5,"0.0-20.1",63438848,25284066);
    insert into mytable
        values (20140422110053,"172.16.10.76",5001,"172.16.10.65",46462,6,"0.0-20.1",11321344,4497094);
    

    全部放入文件data.sql:

    $ python csv2sql.py data.csv > data.sql
    

    data.sql 应用于您的 MySQL 数据库

    最后使用mysql命令(MySQL提供)导入数据库:

    $ myslq --user username --password password db_name < data.sql 
    

    【讨论】:

    • Jan,我尝试了您提供的上述 Python 脚本。我不断收到以下语法错误。你能帮忙解决它吗?我尝试更改语法,看看它是否有其他结果。另外,出于好奇,Python 脚本是否需要“结束模块”类型语句? ------------ 文件“csv2sql.py”,第 22 行打印 sql.format(tablename=tablename, **rec) ^ SyntaxError: invalid syntax ----------- -
    • 我的代码使用 Python 2.7 运行。如果您使用的是 Python 3.x,则必须将 print 语句更改为函数调用,例如 print(sql.format(tablename=tablename=tablename, **rec)。我将重写代码以在两个版本中运行。
    • 奇怪的错误:s1:~$ python csv2sql.py iperf2.csv > iperf2.sql 文件“csv2sql.py”,第 22 行 print(sql.format(tablename=tablename, **rec)) ^ TabError:缩进中制表符和空格的使用不一致。我使用了与您指导的相同的语法。
    • 最后一个错误与您的编辑器有关。关闭使用标签并将所有现有标签替换为 4 个字符。
    • 我仍然收到缩进/制表符错误。我正在使用 gedit。能否请您推荐另一位编辑。我不太习惯使用 vim。
    【解决方案2】:

    这可能不是您正在寻找的答案,但是如果您通过在线学习基础教程来学习一点 sqlite3(一个原生 Python 模块 - “import sqlite3”),您将意识到你的问题并不难解决。然后只需使用标准计时器,例如 time.sleep() 来重复该过程。

    【讨论】:

      【解决方案3】:

      如果您打算使用 Python,那么我建议您使用 sqlalchemy

      一般做法是:

      • 定义类,包含所有要存储的属性
      • 将类的所有属性映射到数据库列和类型
      • 从 csv 读取您的数据(使用例如csv 模块),为每一行创建相应的对象作为之前准备的类,并将其存储。

      sqlalchemy 会为您提供更多细节和说明,您的要求似乎很简单。

      另一种选择是找出现有的 csv 导入工具,其中一些已经在 MySQL 中可用,还有很多其他的。

      【讨论】:

      • 是的,MySQL 已从 CSV 工具导入;但我的 IPERF 工具只显示 CSV 数据 - 我不确定它存储在哪里。|因此,基于此,我想从 IPERF 工具自动收集 CSV 数据,并定期将其放入 MySQL 数据库。
      • 你知道其他可以帮助我实现目标的工具吗?
      • 你可以将输出重定向到像$ iperf -s -y C &gt; data.csv这样的文件中方式 - 这听起来不错。
      猜你喜欢
      • 2015-02-01
      • 2022-01-21
      • 1970-01-01
      • 2020-07-29
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      相关资源
      最近更新 更多