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()є вбудованою функцією python 3.x, тоді як printє оператором python <3.x. Пост показує 2.7.2+.
khachik

2
Ти що from __future__ import print_function? У Python <3 друк - це твердження:
Арі

1
Немає! Я не Звичайно, ти маєш рацію. Це вирішує проблему. Чорт! Отже, задокументована друк у довідці (_ builtins_ ) - це майбутня (3.x) версія друку, що має інший синтаксис. Щиро дякую і вам теж, kachik
alex

2
IMO, help(__builtins__)показуючи, що це взагалі помилка.
Вубл

3
... хоча, досліджуючи далі, пітон 2.7.2 дійсно має вбудовану функцію друку, ви просто не можете отримати доступ до нього легко нормально ( __builtins__.__dict__['print'](value, file=f1)працює, хоча).
Вубл

Відповіді:


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', щоб зробити цей еквівалент для друку.
jlh

44

print(args, file=f1)є синтаксисом python 3.x. Для python 2.x використовуйте print >> f1, args.


3
Думаю, вам слід також згадати from __future__ import print_function. Тоді ви можете використовувати чіткі позначення в обох, Python 2 і 3.
Мартін Тома

@moose, вже є чудова відповідь Гандаро, яка включає мою відповідь та вашу примітку.
citxx

2
Я розумію AttributeError: 'str' object has no attribute 'write'ваш синтаксис python3
Suncatcher

5
@Suncatcher, ти, мабуть, намагаєшся передати рядок, що містить ім'я файлу, як f1 замість фактичного об'єкта файлу. Спочатку потрібно відкрити файл для написання:f1 = open('path_to_your_file', 'w')
citxx

Так, я думав, це має бути ім’я файлу, а не об’єкт файлу.
Suncatcher

13

Ви можете експортувати заяву для друку у файл, не змінюючи жодного коду. Просто відкрийте вікна терміналу і запустіть свій код таким чином:

python yourcode.py >> log.txt


6

У Python 3.0+ printце функція , з якою ви б викликали print(...). У попередній версії print- це заява , з якою ви зробитеprint ... .

Щоб надрукувати файл у Python раніше 3.0, вам слід:

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

>>Оператор направляє друк в файл f.


Я хотів би надрукувати у файлі цілий масив. Якщо я використовую ваш код, було надруковано лише заголовок і хвіст масиву, як вихід з терміналу. Як надрукувати всі рядки масиву у файлі?
Sigur

@Sigur "Як вихід з терміналу" Вибачте, але помилка в іншому місці. Ви не кажете Python надрукувати все це, саме тому це не так.
wizzwizz4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.