【问题标题】:Dealing with empty data while inserting text data in MySql via python script通过python脚本在MySql中插入文本数据时处理空数据
【发布时间】:2016-12-06 13:09:34
【问题描述】:

我正在 MySQL 中读取和存储数据,并且某些列数据包含空值。例如

#"ssd","mode","tolfil","slm.dat","Avg.dat","GP","13","gpro"
#"TIMESTAMP","Reco.no","teminF","ver.ang","hori.ang","vel","sd","vel.data"

"2009-02-25 14:28:36.76", ,8.277527,0.68,0.15,0.42,762.0303,4.6801
"2009-02-25 14:28:36.8", ,8.24408,0.7,0.03,0.3,761.878,4.682412
"2009-02-25 14:29:36.88",2,8.277527,0.55,0.09,0.31,762.0018,4.680709
 "2009-02-25 14:30:36.92",3,8.277527,0.47,0.2,0.31,761.8914,4.684526

所以我收到以下错误。

[1456411716, ' ', '8.277527', '0.68', '0.15', '0.42', '762.0303', '4.6801']

mysql.connector.errors.DatabaseError: 1265 (01000): 
Data truncated for column 'Reco.no' at row 1

我的代码在这里:

 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:]                                                                    
            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()

如果我喜欢这个

            data_buffer = [ts] + data_tmp[1:]           
            for val in data_buffer:
                if val == '':
                    val = None
                    data_buffer.append(val)  
                else:
                    data_buffer.append(float(val))



            print data_buffer

然后我得到了不同的错误

 ValueError: could not convert string to float:

实际上我知道如何处理空数据,但是在上面提到的代码中,我不确定在哪里告诉它,当它遇到空白空间时,它应该将读取和插入作为 NULL 在 MySql 数据库中。

任何帮助将不胜感激。

【问题讨论】:

  • 这是不能通过 LOAD DATA INFILE 完成的事情吗?
  • @e4c5 我没有尝试使用 LOAD DATA INFILE 。我会试一试。 LOAD DATA INFILE 会自动处理空数据吗?我想我可以在 python 脚本中使用它。我的文件也是 11 GB。由很多行组成。
  • @e4c5 但目前您能否给我一个提示或线索,以通过我的代码处理丢失的列数据。提前感谢您的帮助。
  • 您所说的所有这些行可能都可以通过在 mysql 控制台中键入的单个 LOAD DATA INFILE 命令替换。不,它本身不会处理丢失的列,您必须告诉它如何处理它们和/或在表中设置默认值、可为空的列。
  • @e4c5 井数据在不同列中随机丢失。有时列有数据,有时没有。意味着在某个阶段的每一列都缺少数据,除了第一列的时间戳。

标签: python mysql csv


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多