2016-06-21 3 views
0

Я пытаюсь проверить файлы csv, сгенерированные с помощью csv.writer на python 2 & 3 на Linux (Ubuntu 16.04 x64) и Windows (x64). К сожалению, Windows добавляет дополнительные \r каждый раз, когда он пишет в файл.__repr__ в Windows не показывает возврат каретки в терминал

Я думал, что это отлаживать, пытаясь напечатать repr линий в этих файлах, но выход repr не показывает наличие \r на Windows.

Например, строка из файла CSV Показано, как в терминале в Windows:

'display,resource,refs\n' 

То же предложение из того же файла отображается как это на Ubuntu:

'display,resource,refs\r\n' 

Как я могу отлаживать эти дополнительные \r, которые добавляются в мои файлы?

+0

Как вы печатаете эти строки? Что вы на самом деле делаете, когда это имеет значение? Windows и Unix используют разные соглашения о завершении строки, поэтому текстовые файлы будут немного отличаться в двух системах. Но вы можете конвертировать между ними в различные программы, и многие программы могут распознавать любой формат, не требуя от вас ничего делать. – BrenBarn

+0

Как вы открываете файл? Вероятно, вы хотите 'wb', а не' w'. – MatsLindh

+0

@BrenBarn Запуск набора тестов с предварительно сохраненными хэшами в этих файлах дает ошибки в Windows. Я пытаюсь пройти мимо тех, которые удаляют лишние возвращения каретки. – goelakash

ответ

0

Я нашел полезность под названием dos2unix, установленную через pip.

Для преобразования всех \r\n экземпляров в \n экземпляров моего файла CSV, я могу использовать этот код:

import os 
os.system("dos2unix -n "+filename+" "+filename) 
0

Проблема заключается в том, что окна и Linux определить конец строки маркера по-разному. Для linux это всего лишь линейный фид '\n', но для окон это строка, за которой следует возврат каретки '\r\n'.

Когда вы открываете файл для записи в текстовом режиме в Python в Windows, любые символы строки автоматически преобразуются в '\r\n'. Это желательно, так как многие другие программы на окнах не рассматривают собственный символ линии как отдельный маркер строки (например, Блокнот).

Чтобы обойти это, вы можете явно указать python, на что вы хотите, чтобы новый маркер линии выглядел. например.

with open("text.txt", "w", newline="\n") as f: 
    f.write("hello\n") 
    f.write("world\n") 

# open in binary mode so we can see exactly what is in the file 
with open("text.txt", "rb") as f: 
    data = f.read() 

print(repr(data)) 
assert data == b"hello\nworld\n" 

Если вы используете Python 2, то вам необходимо использовать функцию open в io модуль вместо этого.

Смежные вопросы