我正在尝试将一个非常大的文本文件分成两部分,并将这两部分转储到两个不同的mysql表中。我在python中执行此操作,逐行检查文本并按类别代码对每行进行分类。
现在我划分文本后,如何将它们分成两个独立的fifo文件,以便将这些fifo传输到mysql客户端工具?
答案 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
流程。