类型错误:类型 'datetime.date' 的参数不可迭代



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

以下是我从我的SQL数据库获取数据的方式

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")在上面的代码"2018-02-24"上,我已经硬编码,在实际场景 I 中并得到"今天"变量并检查该日期是否在"第 17 行"中可用

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

您可以使用

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循环类似的线性搜索,但速度更快。除了速度之外,唯一真正的区别是,一旦找到匹配项,这些示例就会停止查找,但您的循环不会。您可以通过在if中放置break语句来获得相同的结果。

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

import datetime
now = datetime.datetime.now()
tdy = now.strftime("%Y-%m-%d")
for row in data:
    if tdy == row[17]:
        print('found')

最新更新