Разбор файла журнала с использованием python и сохранение его действительного значения в базе данных с использованием sqlite

Привет, я новичок в python. Я создаю небольшую программу, которая анализирует файл журнала загрузки определенного веб-сайта и сохраняет действительные данные в определенном поле базы данных. (не-ascii-символ 'xe6').

Я также попытался применить решение этого вопроса. Вставка юникода в sqlite?, но этот кодек не может декодировать и предоставляет кодек UnicodeDecodeError: 'charmap' не могу декодировать байт 0x81 в позиции 84: символ сопоставляется с

def db_log_entry(filename):

conn = sqlite3.connect('log.db')
c= conn.cursor()

""" creating log table
Table structure:
    Name          Type
    id            integer
    identifier    text
    url           text
    user_ip       text
    datetime      text
    timezone_mod  text
    query_type    text
    status        text
    opt_id        text
    user_agent    text
    opt_ip        text
    opt_ip_port   text
    """


c.execute(''' CREATE TABLE log
                (id integer, identifier text, url text, user_ip text, datetime text, timezone_mod text, query_type text, query_url text, status text,
                opt_id text, user_agent text, opt_ip text, opt_ip_port text)''')

f=codecs.open(filename,encoding='cp1252') ###   opening file to read data
loop_count=0         # variable to keep record of successful loop iteration
id_count=0           # variable to be entered in id feild of log table




""" Reading each line of log file for performing iterative opertion on each line to parse valid data
 make a entry in database """



for log_line in f:
    loop_count= loop_count+1
    id_count= id_count+1
    list=[]
    db_list=[]


    (txt1,txt2)=log_line.split('HTTP/')        #split the log_line in two parts txt1,txt2 for comparison with reg1,reg2


    reg1= r'(\d{6}_\d{5})\s([\w.-]+)\s([\d.]+)\s-\s-\s\[(\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2})\s([+-]?\d+)\]\s"(\w+)\s([\w.\-\/]+)'
    reg2= r'[1.1"]?[1.0"]?\s(\d*)\s(\d*)([\s\"\-]*)([\w\.\%\/\s\;\(\:\+\)\?\S\"]+)"\s(\d{2,3}.\d{2,3}.\d{2,3}.\d{2,3})\:(\d+)'

    print 'starting loop ',loop_count
    match= re.search(reg1,txt1)
    if match:                                  # If regex match found between (reg1,txt1) than append the data in db_list
        db_list.append(id_count)
        db_list.append(match.group(1))
        print match.group(1)
        db_list.append(match.group(2))
        print match.group(2)
        db_list.append(match.group(3))
        print match.group(3)
        db_list.append(match.group(4))
        print match.group(4)
        db_list.append(match.group(5))
        print match.group(5)
        db_list.append(match.group(6))
        print match.group(6)
        db_list.append(match.group(7))
        print match.group(7)

        print 'yes 1'
    else:
        print 'match not found in reg1'
    match= re.search(reg2,txt2)                 # If regex match found between (reg2,txt2) than append the data in db_list
    if match:
        db_list.append(match.group(1))
        print match.group(1)
        db_list.append(match.group(2))
        print match.group(2)
        #print match.group(3)
        db_list.append(match.group(4))
        print match.group(4)
        db_list.append(match.group(5))
        print match.group(5)
        db_list.append(match.group(6))
        print match.group(6)
        print 'yes 2'
    else:
        print 'match not found in reg2'






    print 'inserting value of',loop_count
    c.execute('INSERT INTO log VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)',db_list)
    conn.commit()
print 'success...'
conn.commit()


def main():

db_log_entry('access_log.txt')



if __name__ == '__main__':
  main()

person Binit Singh    schedule 12.04.2013    source источник
comment
Пожалуйста, не публикуйте весь свой код и не ожидайте, что мы прочитаем его весь. Выделите ту часть, которая вызывает у вас проблему, и покажите ее на кратком примере.   -  person pcalcao    schedule 12.04.2013
comment
Включите полную трассировку исключения. Я сильно подозреваю, что проблема здесь не в SQLite, а в другом аспекте вашего кода.   -  person Martijn Pieters    schedule 12.04.2013
comment
Идея публикации всего моего кода заключается в том, что вам, ребята, будет легче хорошо знать ошибку, и вы сможете легче ее отлаживать.   -  person Binit Singh    schedule 14.04.2013


Ответы (1)


Это потому, что вы используете неправильную кодировку символов для открытия файла.

Вы должны открывать его с помощью UTF-8, например:

f=codecs.open(filename,encoding='utf-8')

Это связано с тем, что CP-1252 является кодировкой латинского алфавита и поэтому не понимать японские иероглифы.

Поскольку я не уверен, что такое исходная кодировка (или язык), UTF-8 также является беспроигрышным вариантом, поскольку он поддерживает все языки.

person Pedro Cunha    schedule 12.04.2013
comment
Прошу прощения, если это не японский. Я не могу отличить японский/китайский/корейский. - person Pedro Cunha; 12.04.2013