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 truncated:MySQL支持日期格式为'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 构造函数,如果它们不是标准的(例如竖线不是:-)。
我在 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 truncated:MySQL支持日期格式为'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 构造函数,如果它们不是标准的(例如竖线不是:-)。