Python 2.7: печать в файл

97

Почему при попытке печати напрямую в файл возникает sys.stdoutследующая синтаксическая ошибка:

Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f1=open('./testfile', 'w+')
>>> print('This is a test', file=f1)
  File "<stdin>", line 1
    print('This is a test', file=f1)
                            ^
SyntaxError: invalid syntax

Из справки (__ builtins__) у меня есть следующая информация:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file: a file-like object (stream); defaults to the current sys.stdout.
    sep:  string inserted between values, default a space.
    end:  string appended after the last value, default a newline.

Итак, каков был бы правильный синтаксис для изменения стандартной потоковой записи для печати?

Я знаю, что есть разные, возможно, лучшие способы записи в файл, но я действительно не понимаю, почему это должна быть синтаксическая ошибка ...

Было бы полезно получить хорошее объяснение!

Алекс
источник
3
Ты уверен? print()- встроенная функция printpython 3.x, а оператор python <3.x. Сообщение показывает 2.7.2+.
хачик
2
А ты from __future__ import print_function? В Python <3 print - это утверждение:
Ари,
1
Нет! Я этого не сделал. Конечно ты прав. Это решает проблему. Черт возьми! Таким образом, документированная печать в справке (_ builtins_ ) - это будущая (3.x) версия print, имеющая другой синтаксис. Спасибо большое и тебе тоже, качик
алекс
2
ИМО, help(__builtins__)отображение этого вообще является ошибкой.
Wooble
3
... хотя, исследуя дальше, python 2.7.2 действительно имеет встроенную функцию печати, вы просто не можете легко получить к ней доступ ( __builtins__.__dict__['print'](value, file=f1)хотя и работает).
Wooble

Ответы:

138

Если вы хотите использовать printфункцию в Python 2, вам необходимо импортировать из __future__:

from __future__ import print_function

Но вы можете добиться того же эффекта и без использования функции:

print >>f1, 'This is a test'
Гандаро
источник
72

print - ключевое слово в python 2.X. Вам следует использовать следующее:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()
Саймон Бергот
источник
2
Вам нужно добавить '\ n', чтобы это было эквивалентно print.
jlh
44

print(args, file=f1)- это синтаксис Python 3.x. Для использования 2.x питона print >> f1, args.

citxx
источник
3
Думаю, вам тоже стоит упомянуть from __future__ import print_function. Тогда вы можете использовать четкие обозначения как в Python 2, так и в 3.
Мартин Тома,
@moose, уже есть отличный ответ Гандаро, который включает мой ответ и вашу заметку.
citxx
2
Я получаю AttributeError: 'str' object has no attribute 'write'с вашим синтаксисом
python3
5
@Suncatcher, вы, вероятно, пытаетесь передать строку, содержащую имя файла, как f1 вместо фактического объекта файла. Сначала нужно открыть файл для записи:f1 = open('path_to_your_file', 'w')
citxx
Да, я подумал, что это должно быть имя файла, а не объект файла.
Suncatcher
13

Вы можете экспортировать оператор печати в файл без изменения кода. Просто откройте окна терминала и запустите свой код следующим образом:

python yourcode.py >> log.txt
Темная Луна
источник
11

Это перенаправит ваш вывод print в файл:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"
Даоктор
источник
это патч обезьяны?
Сарат Садасиван Пиллай,
6

В Python 3.0+ printэто функция , с помощью которой вы бы вызывались print(...). В более ранней версии printэто заявление , которое вы бы сделали с помощью print ....

Чтобы распечатать файл в Python более ранней версии, чем 3.0, вы должны:

print >> f, 'what ever %d', i

>>Оператор направляет печать в файл f.

Нам Нгуен
источник
Я хочу вывести в файл весь массив. Если я использую ваш код, будут напечатаны только голова и хвост массива, как и вывод с терминала. Как вывести все строки массива в файл?
Sigur
@Sigur "Как вывод из терминала" Извините, но ошибка в другом месте. Вы не говорите Python печатать все это целиком, поэтому это не так.
wizzwizz4