2016-12-07 1 views
0

Я пишу/сохраняю данные в MySql через python. Если данные столбцов в MySql содержат «NAN», то как я могу их обработать. На данный момент я знаю, как иметь дело с пустыми пространствами или значениями None, но здесь я застрял. данные выглядит следующим образомПреобразование значений «NAN» в NULL в столбцах MySql с кодом python

# file no 2 
# some description line 
#"Time","col.no","dat.va","all_val","graph_da","tem","vel","acc", "all.valu","rand" 

"2016-02-25 14:50:00",0,12.94,20.88,17.87,"NAN",14,14,13.9,"NAN" 
"2016-02-25 15:00:00",1,13.48,20.86,18,"NAN",13.4,13,13.2,"NAN" 
"2016-02-25 15:10:00",2,13.89,20.84,18.07,18.03,12.8,12,12.6,13 
"2016-02-25 21:30:00",3,15.76,20.18,17.96,18.25,0.09,0,0.07,0.16 
"2016-02-25 21:40:00",4,15.72,,17.91,,0.08,"NAN",0.09,0.18 
"2016-02-25 21:50:00",5,15.66,20.07,17.86,18.17,0.03,"NAN",0.05,0.09 
"2016-02-25 23:30:00",6,14.98,19.26,17.12,17.44,"NAN","NAN","NAN","NAN" 

есть несколько тысяч линии, которая включает в себя случайным образом этот «NAN» Поэтому было бы здорово, если бы кто-нибудь дать мне логику для решения, например, когда речь идет через NAN, он положил NAN или ничего. мой код для работы с пустым пространством, а None - вот так.

with open(filepath) as f: 
    lines = f.readlines() 
max_lines = len(lines) 
for k, line in enumerate(lines): 
    if k >= (int(skip_header_line) + int(index_line_number)): 
     data_tmp = line.strip().split(',') 

     strDate = data_tmp[0].replace("\"", "") 
    strDate = strDate.split('.')[0] 
    timestamp = datetime.datetime.strptime(strDate, '%Y-%m-%d %H:%M:%S') 
    ts = calendar.timegm(timestamp.timetuple())   
    # _ts = ts * 1000000 

     data_buffer = [ts] + data_tmp[1:]                  
     data_buffer = [ts] + data_tmp[1:] 
     data_buffer = [v if v is not "" and v is not " " else None for v in data_buffer] 
     print data_buffer 
     cursor.execute(add_data, data_buffer) 
     cnx.commit() 
     with open(marker_file, "w") as f: 
      f.write(" ".join([ str(item[0]), str(data_tmp[0]), str(max_lines), 
        str(k-int(skip_header_line)+1) ])) 
cursor.close() 
cnx.close() 

Любая помощь или совет будет весьма признателен, потому что я стараюсь изо всех сил, чтобы найти решение, но я не нашел ничего полезного. Заранее спасибо за помощь.

+1

Почему бы не просто предварительно обработать весь файл csv или dat, а заменить «NaN» 'пустым_строкой? Вам даже не нужно писать сценарий python для этого, просто будет работать простой текстовый редактор, который будет искать и заменять. Когда данные импортируются в MySQL, они будут интерпретироваться как нулевые значения, как и нулевые значения, которые отображаются в строке 4 в данных примера, которые вы указали в своем вопросе. – dreftymac

+0

@dreftymac thanx для полезных советов. Я хочу именно эту вещь, чтобы в предварительном процессе заменить «NAN» на пустую строку, но я не могу внести соответствующие изменения. Можете ли вы показать, где я могу внести эти изменения. Я был бы очень благодарен за эту помощь. – Rio

+1

У этого вопроса уже есть ответ на stackoverflow. См., Например, http://stackoverflow.com/a/4128192/42223. Взгляните на это сначала, а затем вернитесь сюда, если вам все еще нужна помощь. – dreftymac

ответ

2

Не пишите свой собственный синтаксический анализатор CSV. Используйте модуль.

Помимо этого вы можете использовать лямбда-функции для фильтрации списков, как показано ниже. Есть одна функция, которая удаляет пустые строки и строки комментариев из csv, и одну из них, которая преобразует "NAN" в None в каждую строку.

import csv 
import calendar 
from datetime import datetime 

with open('foo.csv', newline='') as csvfile: 
    data_lines = lambda l: l[0] != '#' and l.strip() 
    NAN_2_None = lambda i: None if i == "NAN" else i 

    csvreader = csv.reader(filter(data_lines, csvfile), delimiter=',', quotechar='"') 
    for row in csvreader: 
     dt = datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S') 
     row[0] = calendar.timegm(dt.timetuple()) 
     data = map(NAN_2_None, row) 

     # cursor.execute(add_data, data) 
     print(list(data)) 

печатает

 
[1456411800, '0', '12.94', '20.88', '17.87', None, '14', '14', '13.9', None] 
[1456412400, '1', '13.48', '20.86', '18', None, '13.4', '13', '13.2', None] 
[1456413000, '2', '13.89', '20.84', '18.07', '18.03', '12.8', '12', '12.6', '13 '] 
[1456435800, '3', '15.76', '20.18', '17.96', '18.25', '0.09', '0', '0.07', '0.16'] 
[1456436400, '4', '15.72', '', '17.91', '', '0.08', None, '0.09', '0.18'] 
[1456437000, '5', '15.66', '20.07', '17.86', '18.17', '0.03', None, '0.05', '0.09'] 
[1456443000, '6', '14.98', '19.26', '17.12', '17.44', None, None, None, None] 

Однако, вероятно, будет быстрее bulk-load the csv with MySQL, думать о предварительной обработке файла с помощью простого инструмента, как sed и использовать этот подход вместо этого.

+0

Мне очень жаль для позднего ответа. Я застрял в других вещах. Я применил ваше решение сейчас, и его работы отлично работают. Я принимаю ваш ответ. Но я благодарен вам за то, что вы указали на эту массовую вставку csv с MySql. Я попытаюсь использовать sed и сделать некоторые исследования. Я вернусь, если я застрял с массовой вставкой. – Rio

+0

Хорошо, рад слышать, что это сработало для вас. Последующие действия, пожалуйста, как новые вопросы, а не комментарии здесь. – Tomalak

+0

Ну ... Я не могу вас остановить, но нехорошо выкачать людей напрямую. Также нет никакой гарантии, что я могу даже помочь вам с проблемой mySQL.Это намного лучше, если вы зададите автономный вопрос, который стоит сам по себе. Люди придут и попытаются ответить на него. – Tomalak

Смежные вопросы