2010-04-15 28 views
16

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

+0

Đá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

Trả lời

3

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')) 
+1

có vẻ là câu trả lời tốt nhất cho python 2.5 và trước đó là – gaumann

+1

Ví dụ xin vui lòng? –

+2

'def write (self, s):' 'parent.write (self, s.replace (r '\ n', '\ r \ n'))' –

2

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]) 
+0

"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." –

+0

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

+0

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

63

Đố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 
+6

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. –

+3

Trong python3, bạn có thể sử dụng 'open' được tích hợp sẵn với tham số' newline' – johnson

0

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() 
1

Đâ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)) 
Các vấn đề liên quan