我可以得到使用python将excel文档导入mysql的帮助吗?

你好,
这是我第一次发布,只是我第二天在MySQL上使用Python,所以请对我耐心。我还应该说,我正在使用Linux机器。使用Python我能够制作一个数据库和一个表。但是,我很难从Excel中获取值并将其放入桌子中。 Excel文档只有三列,其中:
匹配 - 这只是一个四位数的编号
日期 - 这只是2009-06-29格式的日期
pos-这只是"长"或"短"短语
但是,在执行此操作并尝试查看数据之后,匹配值非常好。所有日期的日期值均出现0000-00-00,因此这是不正确的。对于POS,我得到了这个错误:
mysql_exceptions.operationalError:(1054,"'Unkown列'short'in'field List'")
我尝试将变量类型从VARCHAR更改为文本或日期,但这似乎没有用。实际上,任何建议都将不胜感激。
我使用的代码是:

选择 | 换行 | 行号
  1. from xlrd import open_workbook, cellname
  2. import MySQLdb as mysql
  3. db=mysql.connect(db_info)
  4. c=db.cursor()
  5. c.execute('CREATE DATABASE actual_data')
  6.  
  7. db=mysql.connect(db_info)
  8. c=db.cursor()
  9. c.execute('CREATE TABLE actual_data_table (MATCH_ID VARCHAR(35) NOT NULL,DATETIME VARCHAR(35) NOT NULL,POS_TYPE VARCHAR(35) NOT NULL)')
  10.  
  11. file_to_import='actualdata.xls'
  12. column_count=5
  13. book=open_workbook(file_to_import)
  14. sheet=book.sheet_by_index(0)
  15. conn=mysql.connect(db_info)
  16. cursor=conn.cursor()
  17.  
  18. for row_index in range(sheet.nrows):
  19.  
  20.     row_num=row_index
  21.     MATCH_ID=sheet.cell(row_index,0).value
  22.     DATETIME=sheet.cell(row_index,1).value
  23.     POS_TYPE=sheet.cell(row_index,2).value
  24.  
  25.     cursor.execute('INSERT INTO actual_data_table(MATCH_ID, DATETIME, POS_TYPE) VALUES (%s, %s, %s)'%(MATCH_ID, DATETIME, POS_TYPE))
  26.  
  27.     (MATCH_ID,DATETIME,POS_TYPE)
  28.  
  29.  
  30. cursor.close()
  31. conn.commit()
  32. conn.close()
# 回答1


您首先要确保数据类型相同,因此请阅读前10个REC左右,然后打印出字段,然后键入(日期)等,并确保它们是字符串。其次,我认为MySQL插入的格式是(请注意,您应该根据代码而不是"光标"使用" C")
c.execute('插入实际_data_table值("%s","%s","%s")'%(match_id,dateTime,pos_type))
另一个选择以防万一,因为我使用了另一个SQL,并且在MySQL注释中都有这两个示例
c.execute(u'''插入实际_data_table值(%s,%s,%s)''',match_id,dateTime,pos_type)
这避免了SQL注入afaik
最后,您有重复的代码。您可以删除第一次出现

选择 | 换行 | 行号
  1. db=mysql.connect(db_info)
  2. c=db.cursor()
  3. c.execute('CREATE DATABASE actual_data')
# 回答2


Excel将日期存储为整数。当您从XLRD读取Excel文件的实际日期时,该日期作为浮子出现。它表示自1900年1月1日以来的天数(Windows)。要将适当的信息输入到数据库中,您可以首先将浮点转换为日期。这对我的系统有效:

选择 | 换行 | 行号
  1. import time
  2. import datetime
  3.  
  4. wb = xlrd.open_workbook('data.xls')
  5. sheet1 = wb.sheet_by_index(0)
  6.  
  7. rowList = sheet1.row_values(1)
  8. dateStr = datetime.datetime(*time.strptime("Dec 30 1899", "%b %d %Y")[:6]) + \
  9. datetime.timedelta(days=int(rowList[1]))

我使用" 1899年12月30日",而不是" 1900年1月1日",因为预期结果和实际结果之间有2天的差异。 excel可能会以不同的方式计算leap年。

# 回答3


你好,
我正在尝试使用Python将Excel文档导入MySQL数据库。 Excel文档具有三个数据列:match_id,dateTime和pos_type。最终,使用我将显示的代码,除了一个问题外,我成功地导入了Excel文档。列DateTime具有" Yyyy-MM-DD"格式的值。但是,当我尝试导入时,所有值都以" 0000-00-00"的形式出现。当我尝试将其导入VARCHAR文件时,所有出现的数字只是一个大的五位数数字。我认为这可能与Excel中细胞的形成有关。其他两个值仅是数字字符串和一个简短的单词import perfectl y。我尝试更改变量类型,但这无济于事。清楚地形成了我的代码,您可以看到我很新。您的帮助将不胜感激。

选择 | 换行 | 行号
  1. from xlrd import open_workbook, cellname
  2. import MySQLdb as mysql
  3. db=mysql.connect(db_info)
  4. c=db.cursor()
  5. c.execute('CREATE DATABASE actual_data')
  6.  
  7. db=mysql.connect(db_info)
  8. c=db.cursor()
  9. c.execute('CREATE TABLE actual_data_table (MATCH_ID VARCHAR(35) NOT NULL,DATETIME DATE NOT NULL,POS_TYPE VARCHAR(35) NOT NULL, TICKER VARCHAR(35) NOT NULL, EXIT_TYPE TEXT NOT NULL)')
  10.  
  11. file_to_import='actualdata.xls'
  12. column_count=5
  13. book=open_workbook(file_to_import)
  14. sheet=book.sheet_by_index(0)
  15. db=mysql.connect(db_info)
  16. c=db.cursor()
  17.  
  18. for row_index in range(sheet.nrows):
  19.  
  20.     row_num=row_index
  21.     MATCH_ID=sheet.cell(row_index,0).value
  22.     DATETIME=sheet.cell(row_index,1).value
  23.     POS_TYPE=sheet.cell(row_index,2).value
  24.     c.execute('insert into actual_data_table values ("%s","%s","%s")' % (MATCH_ID, DATETIME, POS_TYPE))
  25.     (MATCH_ID,DATETIME,POS_TYPE)
  26.  
  27. cursor.close()
  28. conn.commit()
  29. conn.close()  
  30.  
# 回答4


罗恩,
请阅读我对您的线程的回复
这里

总而言之,Excel将日期存储为一个数字,并格式化为显示的数字。该数字表示自1900年1月1日以来的天数(Windows)。您可以使用该号码来计算日期。
bvdet
# 回答5


抱歉,我没有继续向下滚动看消息的第二部分。但是,这有很多帮助。谢谢你!!
但是,我还有另一个应该更快的问题。使用以下代码,我选择了11个数字。

选择 | 换行 | 行号
  1. c.execute('SELECT REF_PNL FROM actual_data_table WHERE REF_ENTRY_TIME>"2010-06-29 09:45:00" and REF_ENTRY_TIME<"2010-06-29 10:00:00"')
  2. result1=c.fetchall()
  3.  

当我尝试输出这些结果时,它们会这样出现:
>>>结果1
(('15 .64',),('-5.2',),('24 .25',),('22 .18',),('14 .52',),('21 .8',),('21 .2804',) ,('-0.13',),('15 .48',),('2.2',),('-6.81',))
这很好,但是,我似乎无法使用这些数字进行任何计算。我正在尝试使用numpy来获取这些数字的平均值。但是后来我得到了这个错误:
TypeError:无法使用灵活类型进行降低
结果看起来像元组或其他东西。那么,是否有任何可以将结果分解为常规计算数字?

# 回答6


没问题:

选择 | 换行 | 行号
  1. >>> result
  2. (('15.64',), ('-5.2',), ('24.25',), ('22.18',), ('14.52',), ('21.8',), ('21.2804',), ('-0.13',), ('15.48',), ('2.2',), ('-6.81',))
  3. >>> for item in result:
  4. ...     print float(item[0])
  5. ...     
  6. 15.64
  7. -5.2
  8. 24.25
  9. 22.18
  10. 14.52
  11. 21.8
  12. 21.2804
  13. -0.13
  14. 15.48
  15. 2.2
  16. -6.81
  17. >>> sum([float(item[0]) for item in result])/len(result)
  18. 11.382763636363636
  19. >>> 

标签: python

添加新评论