Python 2.7: In ra tệp


97

Tại sao cố gắng in trực tiếp vào một tệp thay vì sys.stdouttạo ra lỗi cú pháp sau:

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

Từ trợ giúp (__ builtins__) Tôi có thông tin sau:

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.

Vì vậy, cú pháp phù hợp để thay đổi dòng tiêu chuẩn in được ghi vào là gì?

Tôi biết rằng có nhiều cách khác nhau có thể tốt hơn để ghi vào tệp nhưng tôi thực sự không hiểu tại sao đây lại là lỗi cú pháp ...

Một lời giải thích tốt đẹp sẽ được đánh giá cao!


3
Bạn có chắc không? print()là hàm tích hợp trong printpython 3.x , trong khi là toán tử python <3.x. Bài đăng cho thấy 2.7.2+.
khachik

2
Bạn đã from __future__ import print_function? Trong Python <3, print là một câu lệnh:
Ari

1
Không! Tôi đã không. Tất nhiên bạn có quyền. Điều đó giải quyết vấn đề. Khỉ thật! Vì vậy, bản in được lập thành văn bản trong trợ giúp (_ builtins_ ) là phiên bản in trong tương lai (3.x) có cú pháp khác. Cảm ơn bạn rất nhiều và bạn cũng vậy, kachik
alex

2
IMO, help(__builtins__)hiển thị điều đó hoàn toàn là một lỗi.
Wooble

3
... mặc dù, điều tra thêm, python 2.7.2 không có một built-in chức năng in, bạn chỉ có thể không truy cập nó một cách dễ dàng thông thường ( __builtins__.__dict__['print'](value, file=f1)không làm việc, mặc dù).
Wooble

Câu trả lời:


138

Nếu bạn muốn sử dụng printhàm trong Python 2, bạn phải nhập từ __future__:

from __future__ import print_function

Nhưng bạn cũng có thể có tác dụng tương tự mà không cần sử dụng hàm:

print >>f1, 'This is a test'

72

print là một từ khoá trong python 2.X. Bạn nên sử dụng những thứ sau:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()

2
Bạn cần thêm '\ n' để làm cho điều này tương đương với in.
JLH

44

print(args, file=f1)là cú pháp python 3.x. Đối với python sử dụng 2.x print >> f1, args.


3
Tôi nghĩ bạn cũng nên đề cập đến from __future__ import print_function. Sau đó, bạn có thể sử dụng ký hiệu rõ ràng trong cả hai, Python 2 và 3.
Martin Thoma

@moose, đã có một câu trả lời xuất sắc của Gandaro, bao gồm câu trả lời của tôi và ghi chú của bạn.
citxx 13/02/15

2
Tôi nhận được AttributeError: 'str' object has no attribute 'write'với cú pháp python3 của bạn
Suncatcher

5
@Suncatcher, có thể bạn đang cố chuyển chuỗi chứa tên tệp là f1 thay vì đối tượng tệp thực. Bạn cần phải mở tập tin để viết đầu tiên:f1 = open('path_to_your_file', 'w')
citxx

Vâng, tôi nghĩ nó phải là tên tệp, không phải đối tượng tệp.
Suncatcher

13

Bạn có thể xuất báo cáo in ra tệp mà không cần thay đổi bất kỳ mã nào. Chỉ cần mở cửa sổ dòng lệnh và chạy mã của bạn theo cách này:

python yourcode.py >> log.txt

11

Điều này sẽ chuyển hướng đầu ra 'in' của bạn thành một tệp:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"

nó là con khỉ vá?
Sarath Sadasivan Pillai

6

Trong Python 3.0+, printlà một hàm mà bạn sẽ gọi bằng print(...). Trong phiên bản trước, printlà một tuyên bố mà bạn sẽ thực hiện với print ....

Để in ra tệp bằng Python trước 3.0, bạn phải thực hiện:

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

Người >>điều hành chỉ đạo in vào tệp f.


Tôi muốn in toàn bộ một mảng vào tệp. Nếu tôi sử dụng mã của bạn, chỉ phần đầu và phần đuôi của mảng được in, giống như đầu ra từ thiết bị đầu cuối. Làm thế nào để in tất cả các dòng mảng vào tệp?
Sigur

@Sigur "Giống như đầu ra từ thiết bị đầu cuối" Xin lỗi, nhưng lỗi ở chỗ khác. Bạn không yêu cầu Python in toàn bộ, đó là lý do tại sao nó không.
wizzwizz 4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.