【发布时间】: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 井数据在不同列中随机丢失。有时列有数据,有时没有。意味着在某个阶段的每一列都缺少数据,除了第一列的时间戳。