2014-12-05 2 views
-2

Я пытаюсь закодировать сценарий, который обнаруживает текущую дату и время, а затем создает на его основе папку с именем. Я получаю эту ошибку, когда я пытаюсь запустить мой код:ТипError:% d format: требуется номер, а не getset_descriptor

TypeError: %d format: a number is required, not getset_descriptor

Это мой код:

import os 
import time 
#import RPi.GPIO as GPIO 
import logging 
import sys 
from datetime import datetime 
d = datetime 
initYear = "%04d" % (d.year) 
initMonth = "%02d" % (d.month) 
initDate = "%02d" % (d.day) 
initHour = "%02d" % (d.hour) 
initMins = "%02d" % (d.minute)ion where you wish to save files. Set to HOME as default. 
# If you run a local web server on Apache you could set this to /var/www/ to make them 
# accessible via web browser. 
folderToSave = "/home/timelapse/timelapse_" + str(initYear) + str(initMonth) + str(initDate) +  str(initHour) + str(initMins) 
#os.mkdir(folderToSave) 
# Set the initial serial for saved images to 1 
fileSerial = 1 
a = 'timefile' 

# Run a WHILE Loop of infinity 
while True: 
    if os.path.isfile(a) == False: 
    # Set FileSerialNumber to 000X using four digits 
    fileSerialNumber = "%04d" % (fileSerial) 
    # Capture the CURRENT time (not start time as set above) to insert into each capture image filename 
    hour = "%02d" % (d.hour) 
    mins = "%02d" % (d.minute) 
    # Define the size of the image you wish to capture. 
    imgWidth = 800 # Max = 2592 
    imgHeight = 600 # Max = 1944 
    print " ====================================== Saving file at " + hour + ":" + mins 
    # Capture the image using raspistill. Set to capture with added sharpening, auto white balance and average metering mode 
    # Change these settings where you see fit and to suit the conditions you are using the camera in 
    os.system("raspistill -w " + str(imgWidth) + " -h " + str(imgHeight) + " -o " + str(folderToSave) + "/" + str(fileSerialNumber) + "_" + str(hour) + str(mins) + ".jpg -sh 40 -awb auto -mm average -v") 
    # Increment the fileSerial 
    fileSerial += 1 
    # Wait 10 minutes before next capture 
    time.sleep(600) 
else: 
    os.remove(time.txt) 
os.system("sudo shutdown -h -P now") 
break 
print "Quitting now." 
sys.exit(0) 

Я думаю, что код имеет ошибку здесь:

initYear = "%04d" 

Ошибка похоже, вокруг «% 04d». Любые предложения или помощь будут оценены. Заранее спасибо.

+0

Что вы вкладываете * в * эту строку формата? Спецификации заполнителя * не проблема *. –

+0

Это не ваша ошибка. Пожалуйста, предоставьте трассировку. – Gerrat

+0

@MartijnPieters Я удалил «% (d.year)» с конца бит «% 04d» в надежде, что он сработает, но это не помогло. –

ответ

1

Вы не создаете datetime экземпляр здесь:

d = datetime 

Это просто новый ссылка к datetime типа. Атрибуты d.year, d.month и т.д., дескрипторов там, а не значение вы можете интерполировать:

>>> from datetime import datetime 
>>> datetime.year 
<attribute 'year' of 'datetime.date' objects> 
>>> type(datetime.year) 
<type 'getset_descriptor'> 
>>> '%04d' % datetime.year 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: %d format: a number is required, not getset_descriptor 

Если вы хотите текущее время, вам необходимо позвонить datetime.now():

d = datetime.now() 

Там являются лучшими способами использования значения datetime в строке. Вы можете использовать datetime.strftime() method произвести формат строки для даты:

formatted = d.strftime('%Y%m%d%H%M') 
folderToSave = "/home/timelapse/timelapse_" + formatted 

или вы можете использовать одни и те же коды форматирования в str.format() интерполяции:

folderToSave = "/home/timelapse/timelapse_{:%Y%m%d%H%M}".format(d) 
+0

Это сработало! Благодарю. –

0

Ваш Issue ваше использование DateTime. datetime - это класс, а не метод.

, чтобы получить текущую дату, используйте:

d = datetime.now() 

Похоже, что вы пытаетесь форматировать различные компоненты даты. Чтобы ссылаться на них, вы должны использовать такой формат:

inityear = str(d.year) 
Смежные вопросы