2013-05-14 2 views
1

Я новичок в python. Простите меня, если это слишком просто. Я хочу, чтобы извлечь только дату, используя date команды в питонекак удалить ненужные символы из даты вывод команды в python

import subprocess 

p = subprocess.Popen(["date", '+%m/%d/%y'], stdout=subprocess.PIPE) 

output,err = p.communicate() 

print (output) 

Теперь это печатает

b'05/14/13\n' 

Как удалить ненужную «\ п» и b при запуске.

+1

Рассматривали ли вы с помощью ** импорта DateTime ** ** печать datetime.date.today() STRFTIME (' % м /% d /% г») **? Просто говоря ... – tink

+0

@tink: Есть ли какое-то определенное значение для использования 'datetime' в отличие от' time' в этом случае? Это кажется более сложным. – kampu

+0

@tink спасибо. работал на меня. – 2013-05-14 07:18:16

ответ

1

Томаса является правильным, но я чувствую себя более объяснение необходимо.

Я всегда .decode('utf8') результат p.communicate() или check_output() и др. Это связано с тем, что stdout/stdin всегда открывается в двоичном режиме, если вы явно не указали дескриптор файла, поэтому вы всегда получаете/отправляете байты, а не str.

В этом случае, я предлагаю просто использовать check_output(['date','+%m/%d/%y']) вместо создания объекта POPEN который затем в основном выбросить :)

Итак, я хотел бы предложить переписывания это:

import subprocess 
result = subprocess.check_output(['date', '+%m/%d/%y']).decode('utf8').rstrip() 
print (result) 

На более meta level, возникает вопрос, нужно ли вам использовать subprocess для выполнения этой задачи. В конце концов, для форматирования дат/времени существует time.strftime(). Это:

import time 
print(time.strftime('%m/%d/%y')) 

достигает целевого эффекта всей вашей программы в гораздо более простом виде

Кроме того, из tink 's комментарий:.

import datetime 
print datetime.date.today().strftime('%m/%d/%y') 
+1

Спасибо. Я буду ссылаться на это на будущее. Я использовал strftime func – 2013-05-14 07:19:28

2
>>> str(b'05/14/13\n').rstrip() 
'05/14/13' 

Скорость сравнения:

>>> import timeit 
>>> timeit.timeit(r"b'05/14/13\n'.decode('ascii').rstrip()") 
0.7801015276403488 
>>> timeit.timeit(r"str(b'05/14/13\n').rstrip()") 
0.2503617235778428 
+0

В моем сознании всегда возникает вопрос, когда я вижу голый 'str (some_bytes_object)' - какая кодировка используется? («Системное кодирование по умолчанию», aka 'sys.getdefaultencoding()'?). – kampu

+0

Для любопытства, вот несколько цифр: в моей системе, с холодного старта, '..decode (..) .. rstrip()' принимает 1.36967, 'str (..). Rstrip()' принимает 1.15654 , и мой собственный предпочтительный вариант 'str (.., 'utf8'). rstrip()' принимает 1.33954 - интересно, насколько медленнее это происходит с явно указанным параметром кодирования. – kampu

+0

@kampu это интересно (спасибо за запуск этих тестов). Мне нравится ваш любимый для чтения, хотя, если производительность была проблемой, кажется, что 'str (...). Rstrip()' is best – HennyH

1

b означает, что он является бинарной строкой, вы можете получить строку Юникода по output.decode('ascii'). Для того, чтобы избавиться от ведомой новой строки: ответ

output = output.strip() 
output = output.decode('ascii') 
print(output) 
+0

Спасибо. Я назову это на будущее – 2013-05-14 07:18:54