Ответ 1
Вы можете найти строку для \r\n
. Эта строка стиля DOS заканчивается.
EDIT: посмотрите this
У меня есть куча файлов. Некоторые из них - окончание строк Unix, многие из них - DOS. Я хотел бы протестировать каждый файл, чтобы увидеть, если, если формат отформатирован, перед тем, как переключить окончание строки.
Как мне это сделать? Есть ли флаг, на который я могу проверить? Что-то подобное?
Вы можете найти строку для \r\n
. Эта строка стиля DOS заканчивается.
EDIT: посмотрите this
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
(только для Python 2:) Если вы просто хотите читать текстовые файлы, как DOS, так и Unix-форматированные, это работает:
print open('myfile.txt', 'U').read()
То есть, "универсальный" файловый ридер Python автоматически будет использовать все разные маркеры конца строки, переведя их в "\n".
http://docs.python.org/library/functions.html#open
(Спасибо за ручку!)
Как полный новичок Python и просто для удовольствия, я попытался найти минималистический способ проверить это для одного файла. Кажется, что это работает:
if "\r\n" in open("/path/file.txt","rb").read():
print "DOS line endings found"
Изменить: упрощено согласно комментарию Джона Мачина (нет необходимости использовать регулярные выражения).
dos linebreaks \r\n
, только unix \n
. Поэтому просто найдите \r\n
.
Использование 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$'
Вы можете использовать следующую функцию (которая должна работать в 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'