Python MySQLdb 将 CSV 上传到现有 MySQL table;之后,日期和时间字段为 wrong/truncated

Python MySQLdb upload CSV to existing MySQL table; after, Date and Time fields are wrong/truncated

我在 MySQL 中有一个 table,在 table 'art.nettop_masterfile2' 中。我有 运行 从 MySQL Workbench 中导入的 CSV,它没有正确地给出日期和时间字段(它们被 t运行 分类)。

*LOAD DATA LOCAL INFILE    
'C:/Users/ecoker/Documents/webapp_1010/FilesToValidate/FilesAsOf010715/mft4.csv' 
INTO TABLE art.nettop_masterfile2 
FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\n'
ignore 6 ROWS;*

我尝试使用 Python MySQLdb 库来填充相同的 table。代码如下

import csv
import MySQLdb
connection = MySQLdb.connect(host='localhost',
    user='root',
    passwd='****',
    db='art')
cursor = connection.cursor()
query = """ LOAD DATA LOCAL INFILE 'C:/Users/ecoker/Documents/webapp_1010/cyber/dnides/mft4.csv' 
INTO TABLE art.nettop_masterfile2 
FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\n'
ignore 6 ROWS; """
cursor.execute(query)
connection.commit()
cursor.close()

我想知道我需要在上面的 Python 脚本中修改什么才能通过 Python MySQLdb 正确填充我的日期和时间字段,所以它们不是t运行满足了??谢谢!!

我在控制台中收到一条错误消息,它没有填充 table。错误信息是 '...uploadmft.py:66: 警告:数据 t运行 用于第 3 行的列 'FN_mtime' cursor.execute(查询) uploadmft.py:66:警告:第 3 行的第 'FN_adate' 列的数据 t运行 cursor.execute(查询) uploadmft.py:66:警告:第 3 行的第 'FN_atime' 列的数据 t运行 cursor.execute(查询) uploadmft.py:66:警告:数据 t运行 用于第 3 行的列 'FN_cdate' cursor.execute(查询) uploadmft.py:66:警告:第 3 行的第 'FN_ctime' 列的数据 t运行 cursor.execute(查询) uploadmft.py:66:警告:第 3 行的第 'FN_bdate' 列的数据 t运行 cursor.execute(查询) uploadmft.py:66:警告:第 3 行的第 'FN_btime' 列的数据 t运行 cursor.execute(查询) uploadmft.py:66:警告:第 3 行的第 'shortfilename_mdate' 列的数据 t运行 cursor.execute(查询)'

我不确定如何更改 .py 脚本中的查询以使 MySQLdb 正确传达 CSV 并正确填充这些日期和时间字段,例如,不显示为 mostly 00:00:03 和 0000-00-00 等.?

MySQL table 在 MySQL 中有日期和时间列,当我观察 table 时,其中一些在错误消息中被引用。 这是一些日期和时间字段的前几行的片段,因为它们出现在 .csv.

SI mdate     mtime-UTC      SI adate     atime-UTC      SI cdate     ctime-UTC      SI bdate     btime-UTC      FN mdate     mtime-UTC   
3/20/2014    10:50:23.786   3/20/2014    10:50:23.786   3/20/2014    10:50:23.786   3/20/2014    10:50:23.786   3/20/2014    10:50:23.786
3/20/2014    10:50:23.786   3/20/2014    10:50:23.786   3/20/2014    10:50:23.786         3/20/2014  10:50:23.786   3/20/2014    10:50:23.786
3/20/2014    10:50:23.786   3/20/2014    10:50:23.786   3/20/2014    10:50:23.786   3/20/2014    10:50:23.786   3/20/2014    10:50:23.786

更新>>> 我认为最好的方法是添加到我的 MySQL 代码中...http://www.mysqltutorial.org/import-csv-file-mysql-table/

*LOAD DATA LOCAL INFILE    
'C:/Users/ecoker/Documents/webapp_1010/FilesToValidate/FilesAsOf010715/mft4.csv' 
INTO TABLE art.nettop_masterfile2 
FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\n'
ignore 6 ROWS;*

...对于这些变量,我需要添加 SET 语句以将 CSV 中的字符串转换为日期或时间。问题是,在上面的查询中写这个最有效的方法是什么??? 所有 20 多个日期和时间变量的 set 语句...此外,由于我没有唯一字段,并且 CSV 不包含 ID 列,我可能必须使用 MySQLdb 来创建 Table 声明也是如此? CSV 的格式可以在我在原始 post 中提供的带有日期和时间变量的片段中看到。

更新

import csv, datetime
csv.register_dialect('pipes', delimiter='|')
newrows=[]
with open('mft01091.csv') as fin:
    rin = csv.reader(fin, dialect='pipes')
    cols = next(rin)
    for row in rin:
        for i, (name, value) in enumerate(zip(cols, row)):
            if value == '':
                value = 'NULL'
            else:
                if 'date' in name and value:
                    d = datetime.datetime.strptime(value, '%m/%d/%Y')
                    row[i] = d.strftime('%Y-%m-%d')
        newrows.append(row)

参见Mysql date warning data truncatedMySQL支持日期格式为'YYYY-MM-DD',年然后月然后日期

您需要以这种方式重新格式化您的日期(ISO 国际标准格式),现在您似乎 'MM/DD/YYYY'。

Python 当然可以帮助您做到这一点(将输入 CSV 复制到输出格式正确的日期,然后您可以将其加载到 MySQL):

import csv, datetime

with open('input.csv') as fin, open('output.csv', 'w') as fou:
    rin = csv.reader(fin)
    wou = csv.writer(fou)
    cols = next(rin)
    fou.writerow(cols)
    for row in rin:
        for i, (name, value) in enumerate(zip(cols, row)):
            if 'date' in name:
                d = datetime.datetime.strptime(value, '%m/%d/%Y')
                row[i] = d.strftime('%Y-%m-%d')
        fou.writerow(row)

我想 times 的问题是相似的,但我没有详细调查过;我无法立即发现你的问题,因为我很容易 w/the 格式化日期。

顺便说一下,您需要将分隔符 &c 传递给 csv.reader 和 writer 构造函数,如果它们不是标准的(例如竖线不是:-)。