Как я могу обнаружить разрывы строк DOS в файле?

У меня есть куча файлов. Некоторые из них - окончание строк Unix, многие из них - DOS. Я хотел бы протестировать каждый файл, чтобы увидеть, если, если формат отформатирован, перед тем, как переключить окончание строки.

Как мне это сделать? Есть ли флаг, на который я могу проверить? Что-то подобное?

Ответ 1

Вы можете найти строку для \r\n. Эта строка стиля DOS заканчивается.

EDIT: посмотрите this

Ответ 2

Python может автоматически определять, какое соглашение новой строки используется в файле, благодаря "универсальному режиму новой строки" (U), и вы можете получить доступ к предсказанию Python через атрибут newlines файловых объектов:

f = open('myfile.txt', 'U')
f.readline()  # Reads a line
# The following now contains the newline ending of the first line:
# It can be "\r\n" (Windows), "\n" (Unix), "\r" (Mac OS pre-OS X).
# If no newline is found, it contains None.
print repr(f.newlines)

Это дает окончание новой строки первой строки (Unix, DOS и т.д.), если таковая имеется.

Как указал Джон М., если у вас есть патологический файл, который использует более одного кодирования новой строки, f.newlines является кортежем со всеми найденными до сих пор кодировками новой строки, после чтения многих строк.

Ссылка: http://docs.python.org/2/library/functions.html#open

Если вы просто хотите преобразовать файл, вы можете просто сделать:

with open('myfile.txt', 'U') as infile:
    text = infile.read()  # Automatic ("Universal read") conversion of newlines to "\n"
with open('myfile.txt', 'w') as outfile:
    outfile.write(text)  # Writes newlines for the platform running the program

Ответ 3

(только для Python 2:) Если вы просто хотите читать текстовые файлы, как DOS, так и Unix-форматированные, это работает:

print open('myfile.txt', 'U').read()

То есть, "универсальный" файловый ридер Python автоматически будет использовать все разные маркеры конца строки, переведя их в "\n".

http://docs.python.org/library/functions.html#open

(Спасибо за ручку!)

Ответ 4

Как полный новичок Python и просто для удовольствия, я попытался найти минималистический способ проверить это для одного файла. Кажется, что это работает:

if "\r\n" in open("/path/file.txt","rb").read():
    print "DOS line endings found"

Изменить: упрощено согласно комментарию Джона Мачина (нет необходимости использовать регулярные выражения).

Ответ 5

dos linebreaks \r\n, только unix \n. Поэтому просто найдите \r\n.

Ответ 6

Использование grep и bash:

grep -c -m 1 $'\r$' file

echo $'\r\n\r\n' | grep -c $'\r$'     # test

echo $'\r\n\r\n' | grep -c -m 1 $'\r$'  

Ответ 7

Вы можете использовать следующую функцию (которая должна работать в Python 2 и Python 3), чтобы получить представление новой строки, используемое в существующем текстовом файле. Все три возможных вида признаны. Функция читает файл только до первой новой строки для принятия решения. Это быстрее и требует меньше памяти, когда у вас большие текстовые файлы, но не обнаруживает смешанные окончания новой строки.

В Python 3 вы можете передать вывод этой функции параметру newline функции open при записи файла. Таким образом, вы можете изменить контекст текстового файла без изменения его представления новой строки.

def get_newline(filename):
    with open(filename, "rb") as f:
        while True:
            c = f.read(1)
            if not c or c == b'\n':
                break
            if c == b'\r':
                if f.read(1) == b'\n':
                    return '\r\n'
                return '\r'
    return '\n'