Использование python для написания текстовых файлов с окончанием строки DOS в Linux - PullRequest
18 голосов
/ 15 апреля 2010

Я хочу писать текстовые файлы с окончанием строки DOS / Windows '\ r \ n', используя python, работающий в Linux. Мне кажется, что должен быть лучший способ, чем вручную ставить '\ r \ n' в конце каждой строки или использовать утилиту преобразования конца строки. В идеале я хотел бы иметь возможность сделать что-то вроде присвоить os.linesep разделитель, который я хочу использовать при записи файла. Или укажите разделитель строк при открытии файла.

Ответы [ 5 ]

73 голосов
/ 15 апреля 2010

Для Python 2.6 и более поздних версий функция open в модуле io имеет необязательный параметр новой строки, который позволяет вам указать, какие новые строки вы хотите использовать.

Например:

import io
with io.open('tmpfile', 'w', newline='\r\n') as f:
    f.write(u'foo\nbar\nbaz\n')

создаст файл, содержащий это:

foo\r\n
bar\r\n
baz\r\n
3 голосов
/ 15 апреля 2010

Просто напишите файл-подобный, который оборачивает другой файл-подобный и который преобразует \n в \r\n при записи.

Например:

class ForcedCrLfFile(file):
    def write(self, s):
        super(ForcedCrLfFile, self).write(s.replace(r'\n', '\r\n'))
2 голосов
/ 15 апреля 2010

Вы можете посмотреть на это PEP для справки.

Обновление:

@ OP, вы можете попробовать создать что-то вроде этого

import sys
plat={"win32":"\r\n", 'linux':"\n" } # add macos as well
platform=sys.platform
...
o.write( line + plat[platform] )
1 голос
/ 19 мая 2016

Вот сценарий Python, который я написал. Он возвращается из заданного каталога, заменяя все окончания \ n строк окончаниями \ r \ n. Используйте это так:

unix2windows /path/to/some/directory

Он игнорирует файлы в папках, начинающихся с '.'. Он также игнорирует файлы, которые он считает двоичными, используя подход, предложенный Дж. Ф. Себастьяном в этот ответ . Вы можете отфильтровать дальше, используя необязательный позиционный аргумент регулярного выражения:

unix2windows /path/to/some/directory .py$

Вот сценарий полностью. Во избежание сомнений, мои детали лицензированы по лицензии MIT .

#!/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))
0 голосов
/ 15 апреля 2010

Вы можете написать функцию, которая преобразует текст, а затем записывает его. Например:

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