使用Python将.sql文件转换为文本表

时间:2015-04-19 07:15:08

标签: python mysql

我从phpmyadmin直接导出包含所有用户数据的.sql文件。 是否可以在不执行文件的情况下从.sql文件中获取所有列名和值的列表?

我目前正在使用python的MySQLdb库来执行.sql文件并创建以下内容而不会有麻烦,但我试图跳过执行部分并直接转换为.txt文件

示例:

输入文件内容

CREATE TABLE IF NOT EXISTS `login_logs` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Username` varchar(20) NOT NULL,
  `Time` int(11) NOT NULL,
  `IP` varchar(20) NOT NULL,
  `Type` enum('Success','Failed') NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 



INSERT INTO `login_logs` (`ID`, `Username`, `Time`, `IP`, `Type`) VALUES
(1, 'User1', 1411318511, '127.0.0.1', 'Failed'),
(2, 'User2', 1411318674, '127.0.0.1', 'Failed'),
(3, 'User3', 1411318683, '127.0.0.1', 'Success'),
(4, 'User12', 1411319092, '127.0.0.1', 'Success'),
(5, 'User3', 1411319112, '127.0.0.1', 'Success');

输出类似于


ID  |  Username  |     Time    |     IP     |  Type
1   |    User1   | 1411318511  | 127.0.0.1  | Failed
1   |    User2   | 1411318674  | 127.0.0.1  | Failed

稍后将保存在文本文件中。

2 个答案:

答案 0 :(得分:2)

我了解到你想要从sql文件中提取列名和值,并将它们写为txt文件,并将管道作为列分隔符。 下面的代码应该完成这项工作。但是,它完全针对您的输入文件示例进行了定制,尤其是INSERT INTO部分中的文本结构。一旦改变(例如,在插入' INSERT INTO'之后的新行),它就无法工作。

H个

#!/usr/bin/python

def remove_stuff(inp_string):
    """ removes some punctuation marks"""
    pm = ['(', ')', '\'', ';', '`']
    # explicitly remove '),' from values lines
    out_string = inp_string.replace('),','')
    for pmark in pm:
        out_string = out_string.replace(pmark, '')
    return out_string

f = open('sql_statements.sql','r')
out = open('table2.txt','w')
line = f.readline()
vals = 0

while line != '':
    if vals == 1:
        values = line.strip()
        values = remove_stuff(values)
        values = values.split(',')
        values = '|'.join(values)
        out.write(values + '\n')
    if 'INSERT INTO' in line.upper():
        col_names = line.split('(')[1]
        col_names = col_names.split(')')[0]
        col_names = remove_stuff(col_names)
        col_names = col_names.split(',')
        col_names = '|'.join(col_names)
        out.write(col_names + '\n')
        vals = 1
    line = f.readline()

f.close()
out.close()

答案 1 :(得分:1)

试试这个。

import re
s = open('data.sql','r').read()
s = s[s.find('INSERT'):]
c = re.compile('\((.+),(.+),(.+),(.+),(.+)\)')
f = open('out.txt', 'w')
for item in c.findall(s):
    item = [a.replace("'", "").replace("`","") for a in item]
    f.write('\t|\t'.join(item)+'\n')
f.close()

我正在使用正则表达式来匹配模式