Hướng dẫn python script output to file - tập lệnh python xuất ra tệp

Điều này cũng sẽ hoạt động, do tiêu chuẩn hướng ra đầu ra tệp.txt trước khi thực thi "file.py":

import sys

orig = sys.stdout
with open("output.txt", "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig

Ngoài ra, thực thi tập lệnh trong quá trình phụ:

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)

Nếu bạn muốn ghi vào một thư mục, giả sử bạn muốn mã hóa đường dẫn thư mục:

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig

Giới thiệu

Hàm

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 của Python thường được sử dụng để hiển thị văn bản trong dòng lệnh hoặc trong trình thông dịch tương tác, tùy thuộc vào cách thực thi chương trình Python. Tuy nhiên, chúng ta có thể thay đổi hành vi của nó để viết văn bản vào một tệp thay vì vào bảng điều khiển.

Trong bài viết này, chúng tôi sẽ kiểm tra nhiều cách chúng tôi có thể viết vào một tệp với chức năng

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5.

Chuyển hướng đầu ra kịch bản của Python trong thiết bị đầu cuối

Cách nhanh chóng và bẩn để chuyển hướng đầu ra của tập lệnh Python trực tiếp từ dòng lệnh trong khi thực thi tập lệnh.

Ví dụ: nếu chúng ta có một tệp python có tên

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
7 với các nội dung sau:

print("Hallo") # Deliberately in German

Chúng ta có thể chuyển hướng đầu ra của tệp trong shell bằng một khung góc phải duy nhất:

$ python3 hello.py > output.txt

Nếu chúng tôi mở

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
8 mới được tạo, chúng tôi sẽ thấy các nội dung sau:

Hallo

Tuy nhiên, với phương thức này, tất cả đầu ra của tập lệnh được ghi vào một tệp. Nó thường linh hoạt hơn khi thực hiện chuyển hướng này từ trong chính tập lệnh Python.

Chuyển hướng luồng đầu ra tiêu chuẩn

Trong Python, hàm

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 linh hoạt hơn bạn nghĩ. Nó không được mã hóa cứng theo cách mà văn bản được chỉ định chỉ có thể được ghi vào màn hình. Thay vào đó, nó gửi văn bản đến một vị trí gọi là luồng đầu ra tiêu chuẩn, còn được gọi là
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
0.

Tất cả các hệ thống UNIX có ba ống chính - ống đầu vào tiêu chuẩn (

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
1), ống đầu ra tiêu chuẩn (
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
0) và ống lỗi tiêu chuẩn (
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
3).

Theo mặc định, đường ống đầu ra tiêu chuẩn chỉ vào cửa sổ tương tác được sử dụng để thực hiện chương trình, vì vậy chúng ta thường thấy văn bản được in trên màn hình. Tuy nhiên, đầu ra tiêu chuẩn có thể được chuyển hướng đến các vị trí khác, chẳng hạn như các tệp, để thuận tiện.

Nếu đầu ra tiêu chuẩn được chuyển hướng đến một tệp cụ thể, văn bản được chỉ định trong hàm

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 sẽ được ghi vào tệp đó thay vì được hiển thị trên màn hình.

Trong Python, một tham chiếu đến đầu ra tiêu chuẩn có thể thu được bằng cách sử dụng đối tượng

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
0 của mô -đun
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
6. Nó là một đối tượng giống như tệp, có nghĩa là nó có các phương thức cho phép Python đọc và ghi từ nó giống như một tệp thực tế.

Hãy xem một ví dụ trong đó chúng ta thay đổi

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
0 thành một tệp:

import sys

print('This message will be displayed on the screen.')

original_stdout = sys.stdout # Save a reference to the original standard output

with open('filename.txt', 'w') as f:
    sys.stdout = f # Change the standard output to the file we created.
    print('This message will be written to a file.')
    sys.stdout = original_stdout # Reset the standard output to its original value

Hàm

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 lấy đối số chuỗi được cung cấp, nối thêm một ký tự dòng mới đến cuối và gọi phương thức
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
9 để ghi nó vào đầu ra tiêu chuẩn.

Trong ví dụ trên, trước tiên chúng tôi in một dòng văn bản khi chúng tôi đã quen, sẽ được hiển thị trong bảng điều khiển khi chúng tôi chạy tệp. Sau đó, chúng tôi đã chỉ định lại

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
0 cho đối tượng tệp tùy chỉnh của chúng tôi -
print("Hallo") # Deliberately in German
1. Vì một đối tượng tệp có phương thức
print("Hallo") # Deliberately in German
2 hoàn toàn hợp lệ, giá trị in của chúng tôi được ghi vào tệp mà không gặp sự cố.

Lưu ý rằng đó là cách thực hành tốt để lưu trữ giá trị ban đầu của đầu ra tiêu chuẩn trong một biến trước khi thay đổi nó. Bằng cách này, chúng tôi có thể đặt lại đầu ra tiêu chuẩn về giá trị ban đầu của nó sau khi chúng tôi hoàn thành, điều này có thể giúp tránh sự nhầm lẫn.

Hãy lưu mã vào một tệp mới,

print("Hallo") # Deliberately in German
3. Và sau đó, hãy thực hiện nó:

$ python3 printToFile.py

Chúng ta sẽ thấy đầu ra sau trong thiết bị đầu cuối:

This message will be displayed on the screen.

Và tập lệnh sẽ tạo một tệp mới có tên

print("Hallo") # Deliberately in German
4 với các nội dung sau:

Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!

This message will be written to a file.

Bạn chuyển hướng thành công dữ liệu từ luồng đầu ra tiêu chuẩn sang một tệp. Hãy xem làm thế nào chúng ta có thể làm điều này với một đối tượng giống như tệp phổ biến khác dành riêng cho các lỗi lập trình.

Chuyển hướng luồng lỗi tiêu chuẩn

Trong Python, các lỗi được ghi vào luồng lỗi tiêu chuẩn, còn được gọi là

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
3. Điều này cũng mặc định vào cửa sổ tương tác nhưng có thể được thay đổi thông qua đối tượng
print("Hallo") # Deliberately in German
6. Nếu chúng tôi muốn in các giá trị thành
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
3, chúng tôi chỉ có thể chuyển hướng
print("Hallo") # Deliberately in German
8 để trỏ đến
print("Hallo") # Deliberately in German
6.

Tạo một tệp có tên

$ python3 hello.py > output.txt
0 và thêm mã sau:

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
0

Ví dụ này gần như giống hệt với cái trước, ngoại trừ thay vì chuyển hướng luồng đầu ra tiêu chuẩn đến một tệp, chúng tôi chuyển hướng nó sang luồng lỗi tiêu chuẩn. Nếu luồng lỗi tiêu chuẩn cũng được chuyển hướng ở một nơi khác, đầu ra sẽ được gửi đến vị trí đó thay vì đến màn hình.

Hãy chạy tệp này:

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
1

Đầu ra của chúng tôi sẽ hiển thị:

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
2

Mặc dù nó có thể xuất hiện giống như đầu ra thông thường đối với chúng tôi, nhưng đối với máy tính, nó được hiển thị thông qua các đường ống khác nhau.

In bằng tham số "Tệp"

Trong các ví dụ trước, chúng tôi chuyển hướng rõ ràng đầu ra tiêu chuẩn sang đối tượng giống như tệp khác bằng cách thay đổi đối tượng

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
0. Tuy nhiên, để thuận tiện, chúng ta có thể thực hiện điều này trực tiếp từ trong hàm
import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 bằng cách chỉ định vị trí đầu ra với tham số
$ python3 hello.py > output.txt
3:

Ví dụ: nếu chúng tôi muốn in trực tiếp vào một tệp mà không thay đổi toàn bộ tập lệnh

import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
0, chúng tôi sẽ viết:

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
3

Vì chúng tôi không fiddle với việc chuyển hướng đầu ra tiêu chuẩn một cách rõ ràng, chúng tôi không còn phải đặt lại nó về giá trị ban đầu của nó. Kết quả là, đây là cách ưa thích để ghi vào một tệp với chức năng

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5.

Lưu ý: Mặc dù tên của tham số là

$ python3 hello.py > output.txt
3, hãy nhớ rằng nó hoạt động với bất kỳ đối tượng giống như tệp nào. Ví dụ, nếu bạn muốn in lên
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
3, bạn sẽ thay đổi câu lệnh
import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 thành:
Although the parameter's name is
$ python3 hello.py > output.txt
3, remember that it works with any file-like object. If you wanted to print to
import sys
import os.path

orig = sys.stdout
with open(os.path.join("dir", "output.txt"), "wb") as f:
    sys.stdout = f
    try:
        execfile("file.py", {})
    finally:
        sys.stdout = orig
3, for example, you would change the
import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 statement to:

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
4

Sự kết luận

Trong bài viết này, chúng tôi đã thảo luận về việc chuyển hướng đầu ra chức năng

import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5 của Python bằng các phương pháp khác nhau. Các phương pháp này bao gồm chuyển hướng đầu ra của tập lệnh Python từ dòng lệnh, chuyển hướng đầu ra tiêu chuẩn trong các tập lệnh Python và chỉ định một đối tượng giống như tệp trong tham số
$ python3 hello.py > output.txt
3 trực tiếp trong hàm
import subprocess

with open("output.txt", "wb") as f:
    subprocess.check_call(["python", "file.py"], stdout=f)
5.

Bài viết này được viết bởi Jacob Stopak, một nhà phát triển phần mềm và tư vấn với niềm đam mê giúp đỡ người khác cải thiện cuộc sống của họ thông qua mã. Jacob là tác giả của Sách hướng dẫn Coding Essentials cho các nhà phát triển, một cuốn sách giới thiệu bao gồm các khái niệm và công cụ mã hóa thiết yếu. Nó chứa các chương về kiến ​​trúc máy tính cơ bản, Internet, dòng lệnh, HTML, CSS, JavaScript, Python, Java, cơ sở dữ liệu/SQL, Git, v.v.