Tôi muốn viết các tệp văn bản có dòng kết thúc DOS/Windows '\ r \ n' bằng cách sử dụng python đang chạy trên Linux. Dường như với tôi rằng phải có một cách tốt hơn so với tự đặt '\ r \ n' ở cuối mỗi dòng hoặc sử dụng tiện ích chuyển đổi kết thúc dòng. Lý tưởng nhất là tôi muốn có thể làm một cái gì đó như gán cho os.linesep tách mà tôi muốn sử dụng khi viết các tập tin. Hoặc chỉ định trình tách dòng khi tôi mở tệp.Sử dụng python để viết các tệp văn bản với dòng kết thúc DOS trên linux
Trả lời
Chỉ cần viết một tập tin như vậy kết thúc tốt đẹp khác tập tin giống như nay chuyển \n
-\r\n
trên viết.
Ví dụ:
class ForcedCrLfFile(file):
def write(self, s):
super(ForcedCrLfFile, self).write(s.replace(r'\n', '\r\n'))
có vẻ là câu trả lời tốt nhất cho python 2.5 và trước đó là – gaumann
Ví dụ xin vui lòng? –
'def write (self, s):' 'parent.write (self, s.replace (r '\ n', '\ r \ n'))' –
bạn có thể xem số PEP này để tham khảo.
Cập nhật:
@OP, bạn có thể thử tạo một cái gì đó như thế này
import sys
plat={"win32":"\r\n", 'linux':"\n" } # add macos as well
platform=sys.platform
...
o.write(line + plat[platform])
"Không có hỗ trợ đặc biệt cho đầu ra để nộp với một quy ước newline khác, và do đó chế độ" wU "cũng là bất hợp pháp." –
PEP đó là về việc đọc tất cả những gì nó nói về đầu ra, "Không có hỗ trợ đặc biệt cho đầu ra để nộp với một quy ước mới" – gaumann
tôi nghĩ bạn chỉ cần viết một định dạng, ví dụ "\ n" trên linux và sau đó sử dụng chế độ "U" trên cửa sổ và nó sẽ nhận ra? nếu không, xấu của tôi vì đã giải thích sai về PEP. – ghostdog74
Đối với Python 2.6 và sau, open chức năng trong module io
có một tham số xuống dòng tùy chọn cho phép bạn xác định các dòng mới bạn muốn sử dụng.
Ví dụ:
import io
with io.open('tmpfile', 'w', newline='\r\n') as f:
f.write(u'foo\nbar\nbaz\n')
sẽ tạo ra một tập tin có chứa này:
foo\r\n
bar\r\n
baz\r\n
Bạn có thể chấp nhận câu trả lời này (của bạn) thay vì câu trả lời hiện đang được chấp nhận không? Sẽ tốt hơn nếu để người khác xung quanh cho những người bị mắc kẹt trên 2.5 hoặc thấp hơn, nhưng tôi nghĩ đây là câu trả lời tốt hơn cho đa số mọi người. –
Trong python3, bạn có thể sử dụng 'open' được tích hợp sẵn với tham số' newline' – johnson
Bạn có thể viết một hàm có thể chuyển đổi văn bản sau đó viết nó. Ví dụ:
def DOSwrite(f, text):
t2 = text.replace('\n', '\r\n')
f.write(t2)
#example
f = open('/path/to/file')
DOSwrite(f, "line 1\nline 2")
f.close()
Đây là tập lệnh python tôi đã viết. Nó đệ quy từ một thư mục nhất định, thay thế tất cả \ n kết thúc dòng bằng \ r \ n kết thúc. Sử dụng nó như thế này:
unix2windows /path/to/some/directory
Nó bỏ qua tệp trong thư mục bắt đầu bằng dấu '.'. Nó cũng bỏ qua các tệp mà nó cho là các tệp nhị phân, sử dụng cách tiếp cận do J.F. Sebastian cung cấp trong this answer. Bạn có thể lọc thêm bằng cách sử dụng đối số vị trí tùy chọn regex:
unix2windows /path/to/some/directory .py$
Đây là tập lệnh đầy đủ. Để tránh nghi ngờ, các bộ phận của tôi được cấp phép theo số the MIT licence.
#!/usr/bin/python
import sys
import os
import re
from os.path import join
textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f})
def is_binary_string(bytes):
return bool(bytes.translate(None, textchars))
def is_binary_file(path):
with open(path, 'rb') as f:
return is_binary_string(f.read(1024))
def convert_file(path):
if not is_binary_file(path):
with open(path, 'r') as f:
text = f.read()
print path
with open(path, 'wb') as f:
f.write(text.replace('\r', '').replace('\n', '\r\n'))
def convert_dir(root_path, pattern):
for root, dirs, files in os.walk(root_path):
for filename in files:
if pattern.search(filename):
path = join(root, filename)
convert_file(path)
# Don't walk hidden dirs
for dir in list(dirs):
if dir[0] == '.':
dirs.remove(dir)
args = sys.argv
if len(args) <= 1 or len(args) > 3:
print "This tool recursively converts files from Unix line endings to"
print "Windows line endings"
print ""
print "USAGE: unix2windows.py PATH [REGEX]"
print "Path: The directory to begin recursively searching from"
print "Regex (optional): Only files matching this regex will be modified"
print ""
else:
root_path = sys.argv[1]
if len(args) == 3:
pattern = sys.argv[2]
else:
pattern = r"."
convert_dir(root_path, re.compile(pattern))
- 1. Làm thế nào để bạn tìm kiếm các tệp có chứa kết thúc dòng dos (CRLF) với grep trên Linux?
- 2. Dos Lô: ghi vào các tệp không có dòng kết thúc
- 3. Nhà văn csv Python có sử dụng các ký tự cuối dòng DOS không?
- 4. Xác định kết thúc dòng nào được sử dụng trong tệp văn bản
- 5. Git 1.6.4 beta trên Windows (msysgit) - Kết thúc dòng Unix hoặc DOS
- 6. Ký tự cuối dòng từ dòng được đọc từ tệp văn bản, sử dụng Python
- 7. Cách tạo UITextView tự động kết thúc dòng văn bản?
- 8. Codec Python dòng kết thúc
- 9. Linux: Xuất kết quả DD vào một tệp văn bản
- 10. Nhà văn Python 2 CSV tạo dòng kết thúc sai trên Windows
- 11. Viết và đọc các tệp văn bản trên iPhone
- 12. Xóa dòng văn bản khỏi nhiều tệp trong Linux
- 13. Cách chỉnh sửa tệp trong Vim với tất cả các dòng kết thúc bằng^M ngoại trừ dòng cuối cùng kết thúc bằng^M^J
- 14. Đọc các tệp văn bản lớn có dòng trong C#
- 15. Lệnh hoặc tập lệnh Linux đếm các dòng trùng lặp trong một tệp văn bản?
- 16. Tìm và thay thế nhiều dòng trong tệp xml/văn bản bằng cách sử dụng python
- 17. Lệnh linux cat có thể được sử dụng để ghi văn bản vào tệp không?
- 18. Cách thiết lập kết thúc crlf trong QtCreator trên linux
- 19. Dòng kết thúc StreamWriter với Lf thay vì CrLf
- 20. Làm cách nào để khớp chuỗi cho đến khi kết thúc tệp văn bản?
- 21. python - Đọc tệp từ và tới các dòng văn bản cụ thể
- 22. Đặt dòng mặc định kết thúc bằng Java
- 23. Nối các tệp văn bản với dòng lệnh của Windows, thả các dòng đầu tiên
- 24. Python: đọc tất cả các dòng tệp văn bản trong vòng
- 25. Cách tạo vim: nguồn chấp nhận các kết thúc dòng khác nhau?
- 26. Dòng kết thúc SVN
- 27. Bắt đầu và kết thúc tệp trong python với regex
- 28. Làm cách nào để thay đổi kết thúc dòng được fputcsv sử dụng?
- 29. tạo một tệp văn bản và viết trên đó
- 30. Làm cách nào để liệt kê các tệp không kết thúc bằng dòng mới?
Đánh giá từ nhiều câu trả lời "bạn có thể viết ...", không có tính năng 'os.lineEnding' trong Python. Bạn phải tự mình viết một cái gì đó, trong trường hợp đó, ý tưởng của bạn về việc chọn "\ r \ n" hoặc "\ n" là một phương pháp tốt như mọi thứ. Để viết một tập tin, có vẻ như đây là cách duy nhất. – Demis