TypeError:类型' datetime.date'的参数是不可迭代的

时间:2018-03-13 06:19:56

标签: python python-3.x

我有python脚本,其中包含从MySql DB获取数据然后解析该数据

下面是我从MY SQL db获取数据的方式

connection = MySQLdb.connect(host = "192.168.1.50", user = "root", 
password = "root", db = "mydb", port = 32768)
cursor = connection.cursor()
cursor.execute("select * from licenses")
data = cursor.fetchall()

下面是一小部分输出

print(data)

((1,
  'MS SQl',
  'eaf5e1b212e0ad3c4a6172a9e9fd30145dd2d9bf070cc2568fdef384ab63254c',
  datetime.date(2017, 2, 23),
  Decimal('30000.00'),
  '21022018',
  2,
  '',
  1,
  None,
  datetime.datetime(2018, 2, 21, 9, 51, 22),
  datetime.datetime(2018, 2, 21, 11, 26, 17),
  None,
  'Hudson Bay',
  'hudson.bay@ifficeemailid.com',
  None,
  None,
  datetime.date(2018, 2, 24),
  '21022018',
  datetime.date(2018, 2, 25),
  1,
  1,
  0,
  None),
 (2,
  'Palo Alto',
  'eaf5e1b212e0',
  datetime.date(2017, 2, 2),
  Decimal('50000.00'),
  '',
  2,
  '',
  1,
  None,
  datetime.datetime(2018, 2, 21, 10, 5, 16),
  datetime.datetime(2018, 2, 26, 12, 21, 51),
  None,
  'John Snow',
  'john.snow@officeemailid.com',
  None,
  None,
  datetime.date(2018, 2, 22),
  'eaf5e1b212e0',
  datetime.date(2018, 2, 22),
  1,
  1,
  0,
  None))

当我试图从第17行获取数据时,我可以得到

for row in data:
    print row[17]
2018-02-24
2018-02-22

然而,当我尝试添加条件时,它无法正常工作。

for row in data:
    if '2018-02-24' in row[17]:
        print('found')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-50-a5803fbf5283> in <module>()
      1 for row in data:
----> 2     if '2018-02-28' in row[17]:
      3         print(yes)
      4 

TypeError: argument of type 'datetime.date' is not iterable

我的最终目标是从代码= today = datetime.now().strftime("%Y-%m-%d")获取日期 在上面的代码&#39; 2018-02-24&#39;我已经硬化了,在实际场景中我已经实现了这一目标&#39;今天&#39;变量 并检查第17行&#39;

中是否有该日期

但是得到错误,有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您可以使用in在整个列中搜索日期,而不是单个对象:

today = datetime.date.today()
if today in (row[17] for row in data):
    print('found')

如果要比较日期对象,则无需转换为字符串。如果列中有datetime而不是date,则需要进行一次额外转换:

today = datetime.date.today()
if today in (row[17].date() for row in data):
    print('found')

显式生成器可以由map(itemgetter(17), data)map(datetime.date, map(itemgetter(17), data))替换。后者仅在您有datetime时才有必要,错误显示您不会:

from operator import itemgetter

today = datetime.date.today()
if today in map(itemgetter(17), data):
    print('found')

请注意,这些版本都没有显式循环。由于生成器是可迭代的,in将对原始for循环执行类似的线性搜索,但速度更快。除了速度之外,唯一真正的区别是,这些示例将在找到匹配后立即停止查看,但您的循环不会。通过在break中添加if语句,您可以获得相同的结果。

答案 1 :(得分:-1)

试试这个,希望这会有所帮助。假设row[17]是日期对象。

import datetime

now = datetime.datetime.now()
tdy = now.strftime("%Y-%m-%d")

for row in data:
    if tdy == row[17]:
        print('found')