При открытии файлов для использования с модулем csv
на python 3 вам всегда следует добавить newline=""
оператора open:
import sys
mode = 'w'
if sys.version_info[0] < 3:
mode = 'wb'
# python 3 write
with open("somefile.txt", mode, newline="") as f:
pass # do something with f
Параметр newline
не существует в python 2 - но если вы пропустите его в python 3 , вы получите неправильный вывод csv для окон с дополнительными пустыми строками.
См. csv.writer (python 3) :
Если csvfile является файловым объектом, его следует открыть с помощью newline=''
.Если newline=''
не указано, символы новой строки, встроенные в кавычки, не будут правильно интерпретироваться, и на платформах, которые используют \r\n
строк при записи, будет добавлен дополнительный \r
.Всегда должно быть безопасно указывать newline=''
, так как csv модуль выполняет свою собственную (универсальную) обработку новой строки.
Вы должны использовать контекстный менеджмент with
а также:
with open("somefile.txt", mode) as f: # works in 2 and 3
pass # do something with f
, чтобы закрыть дескрипторы файлов, даже если вы столкнулись с каким-то исключением.Это безопасно для Python 2 - см. Методы файловых объектов :
Рекомендуется использовать ключевое слово with
при работе с объектами файла.Преимущество этого заключается в том, что файл правильно закрывается после завершения его набора, даже если по пути возникает исключение.Это также намного короче, чем написание эквивалентных try-finally
блоков.
Ваше решение - некрасиво, но работает:
import sys
python3 = sys.version_info[0] >= 3
if python3:
with open("somefile.txt","w",newline="") as f:
pass
else:
with open("somefile.txt","wb") as f:
pass
Проблема в параметре newline
не существует в python 2. Чтобы исправить это, вам нужно будет обернуть / monkypath open(..)
, включая управление контекстом.