Cách rõ ràng nhất để làm điều này là in vào đối tượng tệp:
with open['out.txt', 'w'] as f:
print['Filename:', filename, file=f] # Python 3.x
print >> f, 'Filename:', filename # Python 2.x
Tuy nhiên, việc chuyển hướng stdout cũng hoạt động cho tôi. Nó có lẽ là tốt cho một tập lệnh một lần như thế này:
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
Vì Python 3.4, có một trình quản lý bối cảnh đơn giản có sẵn để thực hiện việc này trong thư viện tiêu chuẩn:
from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
Chuyển hướng ra bên ngoài từ bản thân vỏ là một tùy chọn khác và thường thích hợp hơn:
./script.py > out.txt
Các câu hỏi khác:
Tên tệp đầu tiên trong tập lệnh của bạn là gì? Tôi không thấy nó được khởi tạo.
Dự đoán đầu tiên của tôi là Glob không tìm thấy bất kỳ bamfiles nào, và do đó, vòng lặp cho vòng không chạy. Kiểm tra xem thư mục có tồn tại không và in ra BamFiles trong tập lệnh của bạn.
Ngoài ra, sử dụng Os.Path.Join và Os.Path.Basename để thao túng các đường dẫn và tên tệp.
mkrieger1
16.2k4 Huy hiệu vàng50 Huy hiệu bạc58 Huy hiệu Đồng4 gold badges50 silver badges58 bronze badges
Đã trả lời ngày 22 tháng 8 năm 2011 lúc 20:00Aug 22, 2011 at 20:00
Gringo Suavegringo SuaveGringo Suave
28.6K6 Huy hiệu vàng84 Huy hiệu bạc74 Huy hiệu đồng6 gold badges84 silver badges74 bronze badges
12
Bạn có thể chuyển hướng in với đối số
./script.py > out.txt
9 [trong Python 2 có toán tử f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
0 thay thế].f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
Trong hầu hết các trường hợp, tốt hơn hết là bạn nên viết vào tệp bình thường.
f.write['whatever']
Hoặc, nếu bạn có một số mục bạn muốn viết với khoảng trống giữa, như
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1:f.write[' '.join[['whatever', str[var2], 'etc']]]
mkrieger1
16.2k4 Huy hiệu vàng50 Huy hiệu bạc58 Huy hiệu Đồng4 gold badges50 silver badges58 bronze badges
Đã trả lời ngày 22 tháng 8 năm 2011 lúc 20:00Aug 22, 2011 at 19:56
3
Gringo Suavegringo Suave
2f = open[filename,'w'] print['whatever', file=f] # Python 3.x print >>f, 'whatever' # Python 2.x
28.6K6 Huy hiệu vàng84 Huy hiệu bạc74 Huy hiệu đồng
Bạn có thể chuyển hướng in với đối số
./script.py > out.txt
9 [trong Python 2 có toán tử f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
0 thay thế].f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
with open['file.txt', 'w'] as f:
print['hello world', file=f]
Trong hầu hết các trường hợp, tốt hơn hết là bạn nên viết vào tệp bình thường.
with open['file.txt', 'a'] as f:
print['hello world', file=f]
mkrieger1
16.2k4 Huy hiệu vàng50 Huy hiệu bạc58 Huy hiệu Đồng4 gold badges50 silver badges58 bronze badges
Đã trả lời ngày 22 tháng 8 năm 2011 lúc 20:00Jul 4, 2016 at 13:45
Gringo Suavegringo SuaveYeo
28.6K6 Huy hiệu vàng84 Huy hiệu bạc74 Huy hiệu đồng6 gold badges62 silver badges89 bronze badges
2
Bạn có thể chuyển hướng in với đối số
./script.py > out.txt
9 [trong Python 2 có toán tử f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
0 thay thế].import sys
sys.stdout=open["test.txt","w"]
print ["hello"]
sys.stdout.close[]
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
Trong hầu hết các trường hợp, tốt hơn hết là bạn nên viết vào tệp bình thường.
Hoặc, nếu bạn có một số mục bạn muốn viết với khoảng trống giữa, như
1:10 gold badges50 silver badges81 bronze badgesf = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
mkrieger1Jun 30, 2015 at 12:15
1
Đã trả lời ngày 22 tháng 8 năm 2011 lúc 19:56
Python 2 hoặc Python 3 Tham khảo API:
Đối số tệp phải là một đối tượng với phương thức
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
3; Nếu nó không có mặt hoặc f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
4, f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
5 sẽ được sử dụng. Vì các đối số in được chuyển đổi thành chuỗi văn bản, f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
6 không thể được sử dụng với các đối tượng tệp chế độ nhị phân. Đối với những điều này, hãy sử dụng f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
7 thay thế.Vì đối tượng tệp thường chứa phương thức f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
8, tất cả những gì bạn cần làm là chuyển một đối tượng tệp vào đối số của nó.
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
Viết/ghi đè lên tệp
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
0Viết/nối vào tệp
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
1Đã trả lời ngày 4 tháng 7 năm 2016 lúc 13:45
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
2Yeoyeo
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
310,9k6 huy hiệu vàng62 Huy hiệu bạc89 Huy hiệu đồng
Điều này hoạt động hoàn hảo:Jan 1, 2018 at 20:54
Bây giờ Hello sẽ được ghi vào tệp Test.txt. Đảm bảo đóng
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
9 với f.write['whatever']
0, mà không có nội dung sẽ không được lưu trong tệpjpyamsAndy k7 gold badges36 silver badges62 bronze badges
2
4.84210 Huy hiệu vàng 50 Huy hiệu bạc81 Huy hiệu Đồng
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
4Đã trả lời ngày 30 tháng 6 năm 2015 lúc 12:15
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
5Không sử dụng
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1, sử dụng f.write['whatever']
2Bạn có thể thay đổi
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
5 để trỏ đến một tệp, nhưng đây là một cách khá cồng kềnh và không linh hoạt để xử lý vấn đề này. Thay vì sử dụng f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1, hãy sử dụng mô -đun f.write['whatever']
2.Với
f.write['whatever']
2, bạn có thể in giống như bạn làm f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
9 hoặc bạn cũng có thể viết đầu ra vào một tệp. Bạn thậm chí có thể sử dụng các cấp tin nhắn khác nhau [f.write['whatever']
8, f.write['whatever']
9, f.write[' '.join[['whatever', str[var2], 'etc']]]
0, f.write[' '.join[['whatever', str[var2], 'etc']]]
1, f.write[' '.join[['whatever', str[var2], 'etc']]]
2], ví dụ, chỉ in các vấn đề lớn vào bảng điều khiển, nhưng vẫn đăng nhập các hành động mã nhỏ vào tệp.Một ví dụ đơn giản
Nhập
f.write['whatever']
2, nhận f.write[' '.join[['whatever', str[var2], 'etc']]]
4 và đặt cấp độ xử lý:Aug 22, 2011 at 20:24
Nếu bạn muốn in vào stdout:Aaron Dufour
Nếu bạn cũng muốn ghi vào một tệp [nếu bạn chỉ muốn ghi vào tệp, hãy bỏ qua phần cuối cùng]:1 gold badge48 silver badges68 bronze badges
3
Sau đó, bất cứ nơi nào bạn sẽ sử dụng
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1 sử dụng một trong các phương pháp f.write[' '.join[['whatever', str[var2], 'etc']]]
4:import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
6Để tìm hiểu thêm về việc sử dụng các tính năng
f.write['whatever']
2 nâng cao hơn, hãy đọc hướng dẫn f.write['whatever']
2 xuất sắc trong các tài liệu Python.
Đã trả lời ngày 1 tháng 1 năm 2018 lúc 20:54
jpyamsjpyams29 gold badges257 silver badges300 bronze badges
3.6757 Huy hiệu vàng36 Huy hiệu bạc62 Huy hiệu ĐồngJan 23, 2018 at 15:51
Giải pháp dễ nhất không phải là thông qua Python; Nó thông qua vỏ. Từ dòng đầu tiên của tệp của bạn [
f.write[' '.join[['whatever', str[var2], 'etc']]]
9] Tôi đoán bạn đang ở trên một hệ thống Unix. Chỉ cần sử dụng các câu lệnh f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1 như bạn thường làm và không mở tệp trong tập lệnh của bạn. Khi bạn đi chạy tập tin, thay vìyunusĐể chạy tệp, sử dụng1 gold badge14 silver badges12 bronze badges
0
Bạn có thể không thích câu trả lời này, nhưng tôi nghĩ đó là đúng. Đừng thay đổi điểm đến stdout của bạn trừ khi nó hoàn toàn cần thiết [có thể bạn đang sử dụng thư viện chỉ xuất ra stdout ??? rõ ràng không phải là trường hợp ở đây].
Tôi nghĩ như một thói quen tốt, bạn nên chuẩn bị dữ liệu của mình trước thời hạn như một chuỗi, sau đó mở tập tin của bạn và viết toàn bộ mọi thứ cùng một lúc. Điều này là do các hoạt động đầu vào/đầu ra là bạn có khả năng xử lý tệp dài hơn, càng có nhiều lỗi xảy ra với tệp này [lỗi khóa tệp, lỗi I/O, v.v.]. Chỉ cần thực hiện tất cả trong một hoạt động mà không còn câu hỏi nào khi nó có thể sai.
Đây là một ví dụ:
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
7Và sau đó, khi bạn hoàn thành việc thu thập "dòng dữ liệu" của mình cho mỗi mục danh sách, bạn có thể tham gia cùng họ với một số ký tự
with open['file.txt', 'w'] as f:
print['hello world', file=f]
7 để tạo ra toàn bộ điều có thể xuất hiện; Thậm chí có thể bọc câu lệnh đầu ra của bạn trong khối with open['file.txt', 'w'] as f:
print['hello world', file=f]
8, để có thêm sự an toàn [sẽ tự động đóng tay cầm đầu ra của bạn ngay cả khi có sự cố xảy ra]:import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
8Tuy nhiên, nếu bạn có rất nhiều dữ liệu để viết, bạn có thể viết nó từng lần một. Tôi không nghĩ rằng nó có liên quan đến ứng dụng của bạn nhưng đây là sự thay thế:could write it one piece at a time. I don't think it's relevant to your application but here's the alternative:
import sys
orig_stdout = sys.stdout
f = open['out.txt', 'w']
sys.stdout = f
for i in range[2]:
print['i = ', i]
sys.stdout = orig_stdout
f.close[]
9Đã trả lời ngày 22 tháng 8 năm 2011 lúc 20:20Aug 22, 2011 at 20:20
Machine khao khát khao khátmachine yearning
9.5715 huy hiệu vàng36 Huy hiệu bạc51 Huy hiệu đồng5 gold badges36 silver badges51 bronze badges
8
Nếu chuyển hướng
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
9 hoạt động cho vấn đề của bạn, câu trả lời của Gringo Suave là một minh chứng tốt cho cách thực hiện.Để làm cho nó trở nên dễ dàng hơn, tôi đã tạo một phiên bản sử dụng BusterManagers cho một cú pháp gọi tổng quát ngắn gọn bằng cách sử dụng câu lệnh
with open['file.txt', 'w'] as f:
print['hello world', file=f]
8:from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
0Để sử dụng nó, bạn chỉ cần làm như sau [bắt nguồn từ ví dụ của Suave]:
from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
1Nó hữu ích cho việc chuyển hướng chọn lọc
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1 khi một mô -đun sử dụng nó theo cách bạn không thích. Nhược điểm duy nhất [và đây là Dealbreaker cho nhiều tình huống] là nó không hoạt động nếu người ta muốn nhiều luồng có các giá trị khác nhau là f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
9, nhưng điều đó đòi hỏi một phương pháp tốt hơn, tổng quát hơn: truy cập mô -đun gián tiếp. Bạn có thể thấy việc thực hiện điều đó trong các câu trả lời khác cho câu hỏi này.Đã trả lời ngày 6 tháng 1 năm 2019 lúc 4:48Jan 6, 2019 at 4:48
GrahamgrahamGraham
2.5853 Huy hiệu vàng15 Huy hiệu bạc 30 Huy hiệu Đồng3 gold badges15 silver badges30 bronze badges
2
Đây là một phương thức khác mà tôi đã sử dụng để in vào tệp/nhật ký ... Sửa đổi chức năng in tích hợp để nó đăng nhập vào một tệp trong thư mục temp với dấu thời gian hiện tại, cũng như in vào stdout. Lợi thế thực sự duy nhất để làm điều này trong một tập lệnh là không phải đi và sửa đổi các câu lệnh in hiện có.
from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
2from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
3Sao chép chức năng in gốc vào biến mới
from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
4from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
5Ghi đè chức năng in hiện có
from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
6from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
7from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
8Hiển thị tệp
from contextlib import redirect_stdout
with open['out.txt', 'w'] as f:
with redirect_stdout[f]:
print['data']
9./script.py > out.txt
0Xóa tệp
./script.py > out.txt
1Đã trả lời ngày 25 tháng 1 lúc 15:28Jan 25 at 15:28
TCB919TCB919TCB919
Phù hiệu đồng 12366 bronze badges
Tôi có thể bẻ khóa điều này bằng phương pháp sau. Nó sẽ sử dụng chức năng in này thay vì chức năng in tích hợp và lưu nội dung vào một tệp.
./script.py > out.txt
2Đã trả lời ngày 18 tháng 9 năm 2021 lúc 19:51Sep 18, 2021 at 19:51
Arjun Garjun gArjun G
2.0441 Huy hiệu vàng18 Huy hiệu bạc18 Huy hiệu đồng1 gold badge18 silver badges18 bronze badges
2
Thay đổi giá trị của sys.stdout không thay đổi điểm đến của tất cả các cuộc gọi để in. Nếu bạn sử dụng một cách khác để thay đổi điểm đến của in, bạn sẽ nhận được kết quả tương tự.
Lỗi của bạn ở một nơi khác:
- Nó có thể nằm trong mã bạn đã xóa cho câu hỏi của bạn [tên tệp đến từ đâu để gọi mở?]
- Nó cũng có thể là bạn không chờ dữ liệu được xóa: Nếu bạn in trên thiết bị đầu cuối, dữ liệu sẽ được xóa sau mỗi dòng mới, nhưng nếu bạn in vào tệp, nó chỉ được xóa khi bộ đệm stdout đầy đủ [4096 byte Trên hầu hết các hệ thống].
Đã trả lời ngày 22 tháng 8 năm 2011 lúc 20:05Aug 22, 2011 at 20:05
JeromejeromeJerome
2.33114 Huy hiệu bạc24 Huy hiệu đồng14 silver badges24 bronze badges
Trong Python 3, bạn có thể chỉ định lại
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1:./script.py > out.txt
3Lưu ý rằng bản in từ
with open['file.txt', 'a'] as f:
print['hello world', file=f]
4 chỉ chuyển đổi đầu ra vì in đang được gán lại trong phạm vi toàn cầu. Nếu chúng ta gán bản in trong một hàm, bản in trong with open['file.txt', 'a'] as f:
print['hello world', file=f]
4 thường không bị ảnh hưởng. Chúng ta có thể sử dụng từ khóa toàn cầu nếu chúng ta muốn ảnh hưởng đến tất cả các cuộc gọi in:./script.py > out.txt
4Cá nhân, tôi thích Sidestepping yêu cầu sử dụng hàm
f = open[filename,'w']
print['whatever', file=f] # Python 3.x
print >>f, 'whatever' # Python 2.x
1 bằng cách nướng bộ mô tả tệp đầu ra vào một hàm mới:./script.py > out.txt
5Đã trả lời ngày 8 tháng 12 năm 2020 lúc 19:04Dec 8, 2020 at 19:04
ShawnshawnShawn
6115 Huy hiệu bạc10 Huy hiệu đồng5 silver badges10 bronze badges
Một cái gì đó mà tôi đã sử dụng trong quá khứ để xuất ra một số từ điển là như sau:
./script.py > out.txt
6Tệp xuất ra sẽ trông giống như dưới đây:
./script.py > out.txt
7Đã trả lời ngày 21 tháng 11 lúc 22:04Nov 21 at 22:04
GSAGSAGSA
5554 Huy hiệu bạc12 Huy hiệu đồng4 silver badges12 bronze badges
Một cái gì đó để mở rộng chức năng in cho các vòng lặp
./script.py > out.txt
8Đã trả lời ngày 16 tháng 7 năm 2017 lúc 19:34Jul 16, 2017 at 19:34
1