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 พิมพ์เป็นคำสั่ง:
Ari

1
ไม่! ฉันไม่ได้ คุณคิดถูกแน่นอน ที่ช่วยแก้ปัญหา บัดซบ! ดังนั้นการพิมพ์เอกสารในวิธีใช้ (_ builtins_ ) จึงเป็นเวอร์ชันการพิมพ์ในอนาคต (3.x) ซึ่งมีไวยากรณ์ที่แตกต่างกัน ขอบคุณมากและคุณเช่นกัน kachik
alex

2
IMO ที่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" เพื่อให้เทียบเท่ากับการพิมพ์
jlh

44

print(args, file=f1)คือไวยากรณ์ python 3.x print >> f1, argsสำหรับการใช้งาน 2.x หลาม


3
from __future__ import print_functionฉันคิดว่าคุณควรพูดถึง จากนั้นคุณสามารถใช้สัญกรณ์ที่ชัดเจนทั้งใน Python 2 และ 3
Martin Thoma

@moose มีคำตอบของ Gandaro ที่ยอดเยี่ยมอยู่แล้วซึ่งรวมถึงคำตอบของฉันและบันทึกย่อของคุณ
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

12

สิ่งนี้จะเปลี่ยนเส้นทางผลลัพธ์ 'พิมพ์' ของคุณไปยังไฟล์:

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

มันเป็นลิงปะ?
ศิววรรณ

6

ในหลาม 3.0+ printเป็นฟังก์ชั่นprint(...)ที่คุณต้องการเรียกด้วย ในเวอร์ชันก่อนหน้าprintนี้เป็นคำสั่งที่คุณต้องทำด้วยprint ...ที่คุณต้องการให้มี

หากต้องการพิมพ์เป็นไฟล์ใน Python ที่เก่ากว่า 3.0 คุณต้องทำดังนี้

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

ประกอบการชี้นำการพิมพ์ไปยังแฟ้ม>>f


ฉันต้องการพิมพ์อาร์เรย์ทั้งหมดลงในไฟล์ ถ้าฉันใช้รหัสของคุณจะมีการพิมพ์เฉพาะส่วนหัวและส่วนท้ายของอาร์เรย์เช่นเอาต์พุตจากเทอร์มินัล จะพิมพ์บรรทัดอาร์เรย์ทั้งหมดไปยังไฟล์ได้อย่างไร?
Sigur

@Sigur "ชอบเอาต์พุตจากเทอร์มินัล" ขออภัยข้อบกพร่องอยู่ที่อื่น คุณไม่ได้บอกให้ Python พิมพ์สิ่งทั้งหมดนั่นคือเหตุผลว่าทำไมจึงไม่ใช่
wizzwizz4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.