python写输出到不同的fifo管道文件?

时间:2014-02-18 07:49:00

标签: python mysql pipe fifo

我正在尝试将一个非常大的文本文件分成两部分,并将这两部分转储到两个不同的mysql表中。我在python中执行此操作,逐行检查文本并按类别代码对每行进行分类。

现在我划分文本后,如何将它们分成两个独立的fifo文件,以便将这些fifo传输到mysql客户端工具?

2 个答案:

答案 0 :(得分:1)

我假设您要做的是调用MYSQL命令

LOAD DATA INFILE

没有实际创建INFILE。您可以尝试使用mysqlimport命令行客户端,并提供它很乐意接受管道,执行以下操作:

python categorize.py --code x big_text_file.txt | mysqlimport db_name /dev/stdin

您的Python脚本通过命令行上的代码输入拆分文本文件,并将结果输出为字符串,并通过管道输出到mysqlimport。

答案 1 :(得分:0)

我认为您正在寻找从同一个Python脚本为两个独立且明显同步的MySQL导入创建管道?

虽然通过shell重定向不能不可能,但这将是痛苦的。您的Python脚本必须以某种方式将其管道的文件描述符传递给shell,因此您的shell脚本可以将这些文件描述符重定向到MySQL命令。

更简单的解决方案是使用subprocess模块在​​Python中完成。

我不知道您希望用于批量加载的工具和语法;所有你告诉我们的是你要给它一个“管道”。所以,我只是假设它是hbristow的答案中提到的mysqlimport命令,并且它通过通常的Unix约定来处理stdin,它将-作为文件名;因为这仅仅是为了展示实际有趣的部分,所以无论如何都无关紧要。

所以:

from subprocess import Popen, stdin

args = ['mysqlimport', my_db_name, '-']
with Popen(args, stdin=PIPE) as import1, Popen(args, stdin=PIPE) as import2:
    with open('giantfile.txt') as f:
        for line in f:
            data = parse(line)
            if belongs_in_import2(data):
                import2.stdin.write(make_sql(data))
            else:
                import1.stdin.write(make_sql(data))

我们创建了两个独立的子进程,每个进程都有自己独立的stdin管道,我们可以像对待任何其他文件一样写入它们。

如果import1.stdin.close()工具要求您在实际等待退出输入文件之前关闭/ EOF输入文件,则可能需要import2.stdin.close()mysqlimport

如果您使用的是Python 2.4-2.7,则应安装并使用subprocess32反向端口。如果由于某种原因你不能这样做(或者如果你使用的是Python 3.0-3.1但由于某种原因无法升级),那么你不能在这里使用with语句;相反,您需要明确close管道和wait流程。