检查TSV文件中的空行,避免对其进行MySQL插入

0 投票
2 回答
770 浏览
提问于 2025-04-18 10:01

我现在正在通过直接读取一个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

你的代码有(至少)两个问题:

  1. 逐行读取文本文件时,永远不会返回一个空字符串(len(line)==0),除了文件的末尾 编辑:即使在文件末尾,使用Python的标准文件迭代器也不会返回空字符串。这是因为返回的每一行都会包含换行符,即使这一行是空的。你可以尝试用 if len(line.strip())>0 来检查那些除了空格和换行符以外还有内容的行。

  2. 解决了第一个问题后,你会发现一个更大的问题:你的代码试图一次性加载整个文件,而不是逐行加载。你可能需要重新调整代码,使用标准的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)
    

撰写回答