2012-03-19 3 views
2

У меня есть следующий раздел, чтобы напечатать файл ant в файл.python 3 print with extra characters

rsltFile = open('buildLog.txt', 'w') 
    p = subprocess.Popen('call ant compile', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    for line in p.stdout.readlines(): 
     rsltFile.write("%s\n" % line) 
     print(line) 
    retval = p.wait() 

Он работал отлично в питона 2,6 но распечатать некоторые дополнительные характер для каждой строки в питона 3.2, как это следующим образом:

b'Buildfile: C:\\workspace\\VCT2400_Service\\ServiceApplication\\build.xml\r\n' 
b'\r\n' 
b'init:\r\n' 
b'\r\n' 
b'clean:\r\n' 
b' [mkdir] Created dir: C:\\workspace\\VCT2400_Service\\ServiceApplication\\classes\r\n' 
b'\r\n' 
b'compile:\r\n' 
b' [javac] Compiling 492 source files to C:\\workspace\\VCT2400_Service\\ServiceApplication\\classes\r\n' 

Те б» и \ r \ n ' являются дополнительными, не ожидайте их там.

+0

'.readlines()' здесь избыточен (и, вероятно, менее эффективен, так как я полагаю, что он будет строить весь список выходных строк до начала итерации); вы можете просто обрабатывать сам объект файла как итератор. – geoffspear

+0

как это сделать? Я новичок в python. – 5YrsLaterDBA

+0

'для строки в p.stdout:' –

ответ

3

Файлы, открытые в текстовом режиме, ожидают, что в них будут записаны строки. Вы получаете байт-объекты от readlines(), которые преобразуются в строковое представление в формате %.

Открыть файл в двоичном режиме и отвальных линий там непосредственно:

rsltFile = open('buildLog.txt', 'wb') 
... 
rsltFile.write(line + b'\n') 

... или, интерпретировать выходной подпроцесс как строка:

linestr = line.decode('utf8') 

P.S. Похоже, добавление «\ n» не требуется, каждый line уже заканчивается символом новой строки.

1

Попробуйте добавить это universal_newlines=True в класс разработчика Popen.

p = subprocess.Popen('call ant compile', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True) 
+0

Отлично работает в python 3.6 – Anekdotin