检查TSV文件中的空行,避免对其进行MySQL插入
我现在正在通过直接读取一个TSV文件来进行MySQL的插入操作。现在遇到的问题是,当TSV文件中有空行时,数据库里会插入NULL值。
我写了以下代码来逐行读取整个TSV文件,只有在行不为空的情况下才进行插入。
with open('file.tsv','r+w') as file:
for line in file:
if len(line)>0:
#upload to DB
conn = connect_db()
cursor = conn.cursor()
try:
cursor.execute("LOAD DATA LOCAL INFILE "file.tsv" INTO TABLE abcd FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' (@col1,@col2,@col3) set a=@col1,b=@col2,grid=@col3,date='"+date+"', pipeline='"+pipeline_name+"'")
conn.close()
except:
print (cursor._last_executed)
raise
从TSV文件读取后,MySQL输出的错误示例 -
13 | 2014-06-16 | apollo | PT | 380 | 316 |
| 14 | 2014-06-16 | apollo | | 0 | NULL |
期望的MySQL输出 -
13 | 2014-06-16 | apollo | PT | 380 | 316 |
13 | 2014-06-17 | apollo | PT | 350 | 312 |
有人能告诉我怎么才能实现上面的目标吗?
2 个回答
0
你打开文件的方式会导致空行的长度为1,这是因为文件的结束符(EOL字符)。一个更好的方法是使用Python的CSV模块,并设置delimiter = '\t'
。
其次,正如@dan所说,为什么你要尝试一次性插入整个文件,而不是一行一行地处理呢?
2
你的代码有(至少)两个问题:
逐行读取文本文件时,永远不会返回一个空字符串(
len(line)==0
),除了文件的末尾编辑:即使在文件末尾,使用Python的标准文件迭代器也不会返回空字符串。这是因为返回的每一行都会包含换行符,即使这一行是空的。你可以尝试用if len(line.strip())>0
来检查那些除了空格和换行符以外还有内容的行。解决了第一个问题后,你会发现一个更大的问题:你的代码试图一次性加载整个文件,而不是逐行加载。你可能需要重新调整代码,使用标准的SQL
INSERT
语句,而不是MySQL的LOAD DATA
扩展。最终的结果应该看起来像这样:
db = ... cur = db.cursor() for line in f: if len(line.strip()) > 0: # tab-separated, right? fields = line.strip().split('\t') cursor.execute("INSERT INTO table_foo (a,b,c) VALUES (%s,%s,%s)", fields)