Python csv writer добавляет дополнительную строку при выполнении в окнах [duplicate]
Я могу решить проблему, и теперь я могу получить доступ к хром с желаемым URL.
Результаты попыток предоставленных решений:
Я попробовал все настройки, как указано выше, но я не смог решить проблему
В соответствии с моим наблюдением файл DevToolsActivePort не существует вызванный, когда chrome не может найти свою ссылку в папке scoped_dirXXXXX.
Шаги, предпринятые для решения проблемы
- Я убил все процессы chrome и chrome driver.
- Добавлен код ниже, чтобы вызвать chrome
System.setProperty("webdriver.chrome.driver","pathto\\chromedriver.exe"); ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("useAutomationExtension", false); WebDriver driver = new ChromeDriver(options); driver.get(url);
. Используя вышеописанные шаги, я смог решить проблему.
5 ответов
В Python 2 откройте outfile с режимом ‘wb’ вместо ‘w’ . csv.writer записывает \r\n в файл напрямую. Если вы не откроете файл в режиме binary , он напишет \r\r\n , потому что в режиме Windows текст переводит каждый \n в \r\n .
В Python 3 был изменен требуемый синтаксис, поэтому откройте outfile с дополнительным параметром newline=» .
Примеры:
# Python 2 with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile: writer = csv.writer(outfile) # Python 3 with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile: writer = csv.writer(outfile)
Ссылки на документацию
В любом случае ответ @Mark Tolonen разрешил много вопросов, связанных с добавленной строкой, добавленной при сохранении текстового файла стандарта (без использования csv). – dlewin 24 September 2015 в 09:32
Для совместимости между 2.6 / 2.7 и 3 вы можете использовать io.open с аргументом newlines . Если вы все еще пишете в 2.x, это похоже на лучший выбор, так как он совместим с переходом. – jpmc26 27 September 2017 в 18:49
Открытие файла в двоичном режиме «wb» не будет работать в Python 3+. Вернее, вам придется преобразовать свои данные в двоичные файлы, прежде чем писать. Это просто хлопот.
Вместо этого вы должны сохранить его в текстовом режиме, но переопределите новую строку как пустую. Например:
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
Я пишу этот ответ w.r.t. на python 3, поскольку у меня изначально была та же проблема.
Я должен был получить данные из arduino с помощью PySerial и записать их в CSV-файле. Каждое чтение в моем случае заканчивалось на ‘\r\n’ , поэтому новая строка всегда разделяла каждую строку.
В моем случае опция newline=» не работала. Потому что это показало некоторую ошибку, например:
with open('op.csv', 'a',newline=' ') as csv_file: ValueError: illegal newline value: ''
Итак, казалось, что они не согласны с отсутствием новой строки здесь.
Увидев только один из ответов, я упомянул о терминаторе линии в объекте writer, например,
writer = csv.writer(csv_file, delimiter=’ ‘,lineterminator=’\r’)
, и это работало для меня для пропуска дополнительных строк перевода строк.
Примечание. Кажется, это не предпочтительное решение из-за того, как добавлена дополнительная строка в системе Windows. Как указано в python documement :
Если csvfile является файловым объектом, он должен быть открыт с флагом ‘b’ на платформах, где это имеет значение.
Windows — одна из таких платформ, где это имеет значение. Хотя изменение ограничителя строк, как я описал ниже, возможно, устранил проблему, проблему можно было бы вообще избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более «изящно». «Fiddling» с терминатором линии, вероятно, привел бы к неспортивному коду между системами в этом случае, когда открытие файла в двоичном режиме в системе unix не приводит к эффекту. то есть. это приводит к совместимому с перекрестной системой коду.
Из Документы Python :
В Windows, ‘b’, добавленный в режим, открывает файл в бинарный режим, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но это приведет к повреждению двоичных данных, подобных этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить «b» в режим, поэтому вы можете использовать его независимо для всех двоичных файлов.
Оригинал:
Как часть необязательных параметров для csv.writer, если вы получаете лишние пустые строки, вам может потребоваться изменить определитель (info здесь ). Пример ниже адаптирован с страницы python csv docs. Измените его с ‘\n’ на все, что должно быть. Поскольку это всего лишь удар в темноте при этой проблеме, это может работать или не работать, но это мое лучшее предположение.
>>> import csv >>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n') >>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) >>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
Я собирался опубликовать об этом — lineterminator = ‘\n’ работал для меня в простом тесте. – Dan Breslau 27 July 2010 в 23:39
я могу это сделать & gt; с открытым (‘/ pythonwork / thefile_subset11.csv’, ‘w’), lineterminator = ‘\n’ как outfile: – l—»»»———»»»»»» 27 July 2010 в 23:41
@I__: Вы действительно должны начать просматривать документы Python. Дерек дал вам ссылку: docs.python.org/library/csv.html – Dan Breslau 27 July 2010 в 23:49
dan breslau, это имя является браслевым изначально правильно? ваши предки — откуда беларусия или украина? – l—»»»———»»»»»» 28 July 2010 в 01:20
Простой ответ заключается в том, что файлы csv всегда должны открываться в двоичном режиме, будь то для ввода или вывода, поскольку в противном случае на Windows возникают проблемы с завершением строки. В частности, на выходе модуль csv будет писать \r\n (стандартный разделитель строк CSV), а затем (в текстовом режиме) среда выполнения заменит \n на \r\n (стандартный терминатор линии Windows), давая результат \r\r\n .
Скрипт с lineterminator НЕ является решением.
@Dan: Я использовал «стандартный» как прилагательное, а не существительное, означающее «обычный». или «обычное». Если вы хотите приблизиться к стандарту (существительному), прочитайте tools.ietf.org/html/rfc4180 – John Machin 28 July 2010 в 01:26
Точка (как вы подразумеваете), что нет стандарта. Это RFE является информационным. Хотя\r\n может быть «стандартным» в Windows я уверен, что приложения Unix обычно не видят этого. – Dan Breslau 28 July 2010 в 03:51
@Dan: Это правильно — нет стандарта. В сценариях должен указываться определитель [должен был быть назван ROWterminator], который они хотят (если не по умолчанию), и все еще используют двоичный режим в случае, если сценарий запущен в Windows, в противном случае «определитель имен» могут быть набиты. – John Machin 28 July 2010 в 04:28
CSV-файл, написанный на Python, содержит пустые строки между каждой строкой
Этот код читает thefile.csv , вносит изменения и записывает результаты в thefile_subset1 . Однако, когда я открываю результирующий csv в Microsoft Excel, после каждой записи появляется дополнительная пустая строка! Есть ли способ сделать это, если не поставить лишнюю пустую строку?
8 ответов
В Python 2 откройте outfile с режимом ‘wb’ вместо ‘w’ . csv.writer записывает \r\n в файл напрямую. Если вы не откроете файл в двоичном режиме, он напишет \r\r\n , потому что в текстовом режиме Windows переведет каждый \n в \r\n .
В Python 3 требуемый синтаксис изменился, поэтому откройте outfile с дополнительным параметром newline=» .
Примеры:
# Python 2 with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile: writer = csv.writer(outfile) # Python 3 with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile: writer = csv.writer(outfile)
Ссылки на документацию
В любом случае, ответ @Mark Tolonen решил многие вопросы, связанные с дополнительными строками, добавленными при сохранении стандартного (без использования csv) текстового файла.
Для обеспечения совместимости между 2.6 / 2.7 и 3, вы можете использовать io.open с newlines аргументом. Если вы все еще пишете в 2.x, это все равно кажется лучшим выбором, так как он совместим с форвардом.
@jpmc26 jpmc26 Обычно это хороший совет, но модуль csv не работает должным образом с io.open . Существует сторонний модуль unicodecsv для Python 2.7, который работает лучше.
Открытие файла в двоичном режиме «wb» не будет работать в Python 3+. Вернее, вам придется преобразовать свои данные в двоичные файлы, прежде чем писать. Это просто хлопот.
Вместо этого вы должны сохранить его в текстовом режиме, но переопределите новую строку как пустую. Например:
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
Простой ответ заключается в том, что файлы csv должны всегда открываться в двоичном режиме для ввода или вывода, так как в противном случае на Windows возникают проблемы с завершением строки. В частности, на выходе модуль csv будет писать \r\n (стандартный разделитель строк CSV), а затем (в текстовом режиме) среда выполнения заменит \n на \r\n (стандартный терминатор линии Windows), давая результат \r\r\n .
Скрипт с lineterminator НЕ является решением.
@Dan: я использовал «стандарт» как прилагательное, а не существительное, что означает «обычный» или «обычное». Если вы хотите приблизиться к (существительному) стандарту, прочитайте tools.ietf.org/html/rfc4180
Дело в том (как вы подразумеваете), что нет стандарта. Это РСЕ информационное. Хотя \ r \ n может быть «стандартным» в Windows, я уверен, что приложения Unix обычно не видят этого.
@Dan: Дан: Это правильно — нет стандарта. В сценариях должен быть указан определитель строки [должен был называться ROWterminator], который они хотят (если не по умолчанию), и по-прежнему использовать двоичный режим в случае, если сценарий запускается в Windows, в противном случае «ограничитель строки» может быть заполнен.
Примечание. Кажется, это не предпочтительное решение из-за того, как добавлена дополнительная строка в системе Windows. Как указано в документе python:
Если csvfile является файловым объектом, он должен быть открыт с флагом «b» на платформах, где это имеет значение.
Windows — одна из таких платформ, где это имеет значение. Хотя изменение ограничителя строк, как я описал ниже, возможно, устранил проблему, проблему можно было бы вообще избежать, открыв файл в двоичном режиме. Можно сказать, что это решение более «изящно». «Fiddling» с терминатором линии, вероятно, привел бы к неспортивному коду между системами в этом случае, когда открытие файла в двоичном режиме в системе unix не приводит к эффекту. то есть. это приводит к совместимости кода, совместимого с системой.
В Windows «b», добавленный в режим, открывает файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но они повреждают двоичные данные, подобные этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить «b» в режим, поэтому вы можете использовать его платформу независимо для всех двоичных файлов.
Как часть необязательных параметров для csv.writer, если вы получаете дополнительные пустые строки, вам может потребоваться изменить определитель (info here). Пример ниже адаптирован из страницы python csv docs. Измените его на «\n» на все, что должно быть. Поскольку это просто удар в темноте, проблема может быть или не работать, но это мое лучшее предположение.
>>> import csv >>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n') >>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) >>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])