Как убрать n python при чтении из файла

Обновлено: 07.07.2024

Правильная вещь - использовать код «escape-escape» для декодирования строки.

Не используйте AST или eval. Использование строковых кодеков намного безопаснее.

В Python 3 команда должна быть print(bytes(myString, "utf-8").decode("unicode_escape")) – dln385 26 October 2010 в 07:06 Согласился с @Apalala: это недостаточно. Ознакомьтесь с ответом rseeper ниже для полного решения, которое работает в Python2 и 3! – Christian Aichinger 28 March 2016 в 03:26

Фактически правильный и удобный ответ для python 3:

Подробности относительно codecs.escape_decode :

  • codecs.escape_decode - это декодер с байтами в байтах
  • codecs.escape_decode декодирует escape-последовательности ascii, такие как: b"\\n" -> b"\n" , b"\\xce" -> b"\xce" .
  • codecs.escape_decode не заботятся или необходимо знать о кодировке байтового объекта, но кодирование экранированных байтов должно соответствовать кодировке остальной части объекта.
  • @rspeer верен: unicode_escape является неправильным решением для python3. Это связано с тем, что unicode_escape декодирует экранированные байты, затем декодирует байты в строку unicode, но не получает никакой информации о том, какой кодек использовать для второй операции.
  • @Jerub верен: избегайте AST или eval.
  • Я впервые обнаружил codecs.escape_decode из этот ответ на вопрос «как я .decode (« string-escape ») в Python3?» . Как сказано в этом ответе, эта функция в настоящее время не документирована для python 3.
Это реальный ответ (: Слишком плохо, что он опирается на плохо документированную функцию. – jwd 21 February 2017 в 19:42 Это ответ для ситуаций, в которых у вас есть escape-последовательности \x с байтами UTF-8. Но поскольку он декодирует байты в байты, он не выполняет и не может декодировать любые escape-символы символов Unicode, отличных от ASCII, например escape-последовательности \u . – rspeer 16 August 2017 в 17:10

Функция ast.literal_eval приближается, но она будет ожидать, что строка будет правильно процитирована сначала.

Конечно, интерпретация обратного слэша Python зависит от того, как строка ( "" vs r"" vs u"" , тройные кавычки и т. д.), поэтому вам может понадобиться обернуть ввод пользователя в подходящие кавычки и перейти к literal_eval . Обтекание его в кавычках также предотвратит возврат literal_eval числа, кортежа, словаря и т. Д.

Вещи все еще могут оказаться сложными, если пользователь вводит кавычки без кавычек типа, который вы собираетесь обернуть вокруг строки.

@ dln385: literal_eval никогда не выполняет код. Из документации "Это можно использовать для безопасной оценки строк, содержащих выражения Python, из ненадежных источников без необходимости самостоятельно анализировать значения. & Quot; – Greg Hewgill 26 October 2010 в 05:16

Если вы доверяете источнику данных, просто пошагите кавычки вокруг него и eval () it?

PS. добавлена ​​встречная мера зла-кода-exec - теперь она будет разбивать все " до eval-ing

Лучшее решение, чем общее назначение eval() , см. В моем ответе. – Greg Hewgill 26 October 2010 в 04:52 Лучшее решение, чем использование модуля ast, см. В моем ответе. – Jerub 26 October 2010 в 06:14 @Greg Hewgill: из любопытства, можете ли вы подумать о каком-либо риске после удаления котировок, как в моем исправленном примере? что ваш аст также имеет проблемы с тем, если в строке есть кавычки, которые «соответствуют», строковые брекеты – Nas Banov 26 October 2010 в 06:21 @Nas Banov: Ваш пример все равно выдает ошибку, если myString заканчивается обратным слэшем. Не серьезная проблема, но, вероятно, нежелательная. – Greg Hewgill 26 October 2010 в 07:00 @Greg Hewgill: не будет ast.literal_eval() делать то же самое? (у меня нет проверки на python 2.6). для меня исключение для исключения из невербальной строки в порядке, «инъекция строки» эксплоит - это то, что меня беспокоит – Nas Banov 27 October 2010 в 00:57

unicode_escape не работает вообще

Оказывается, что решение string_escape или unicode_escape не работает вообще - в частности, оно не работает при наличии фактический Unicode.

Если вы можете быть уверены, что каждый символ не-ASCII будет экранирован (и помните, что все, что находится за пределами первых 128 символов, не является ASCII), unicode_escape будет делать то, что вам нужно. Но если в вашей строке есть какие-то буквальные символы, отличные от ASCII, все будет не так.

unicode_escape в основном предназначен для преобразования байтов в текст Unicode. Но во многих местах - например, исходный код Python - исходные данные уже являются текстами Unicode.

Единственный способ, которым это может работать правильно, - это сначала кодировать текст в байты. UTF-8 - разумная кодировка для всего текста, так что это должно работать, правильно?

Следующие примеры приведены в Python 3, так что строковые литералы чисты, но та же проблема существует с немного отличающимися проявлениями на обоих Python 2 и 3.

Ну, это неправильно.

Новый рекомендованный способ использования кодеков, которые декодируют текст в текст, - это вызвать codecs.decode напрямую. Это помогает?

Совсем нет. (Кроме того, вышесказанное представляет собой UnicodeError на Python 2.)

Кодек unicode_escape , несмотря на его имя, оказывается, что все байты, отличные от ASCII, находятся в латинском-1 (ISO-8859 -1). Поэтому вам нужно будет сделать это так:

Но это ужасно. Это ограничивает 256 символов Latin-1, как если бы Unicode никогда не был изобретен вообще!

Добавление регулярного выражения для решения проблемы

(Удивительно, что мы теперь нет двух проблем.)

Нам нужно только применить декодер unicode_escape к вещам, которые, несомненно, будут ASCII-текстом. В частности, мы можем убедиться, что применим только к действительным escape-последовательностям Python, которые гарантированно будут ASCII-текстом.

В данной теме представлены примеры записи и чтения информации для текстовых файлов.

Содержание

  • 1. Чтение/запись списка, содержащего n целых чисел
  • 2. Чтение/запись списка, содержащего строки
  • 3. Чтение/запись кортежа, содержащего объекты чисел с плавающей запятой
  • 4. Чтение/запись кортежа содержащего разнотипные объекты
  • 5. Чтение/запись словаря
  • 6. Чтение/запись двумерной матрицы целых чисел, представленной в виде списка
  • 7. Чтение/запись множества, которое содержит целые числа
  • 8. Чтение/запись данных разных типов: список и кортеж

Поиск на других ресурсах:

1. Чтение/запись списка, содержащего n целых чисел

В примере демонстрируются следующие операции:

  • создание списка из 10 случайных чисел;
  • сохранение списка в текстовом файле;
  • чтение из файла в новый список с целью контроля.

Текст программы следующий:

Результат работы программы

2. Чтение/запись списка, содержащего строки

При чтении/записи строк не нужно реализовывать дополнительные преобразования из одного типа в другой, так как данные из файла читаются в виде строк.

Результат работы программы

3. Чтение/запись кортежа, содержащего объекты чисел с плавающей запятой

Пример демонстрирует запись и чтение кортежа, который содержит объекты чисел с плавающей запятой.

Результат работы программы

Вид файла myfile5.txt

4. Чтение/запись кортежа содержащего разнотипные объекты

В случае, если кортеж содержит объекты разных типов при записи/чтении важно придерживаться последовательности этапов конвертирования объектов в нужный тип. Ниже приведен пример записи и чтения кортежа, который содержит объекты целого, логического и строчного типов.

Результат выполнения программы

5. Чтение/запись словаря

Словарь также можно записывать в файл. В данном примере записывается и читается словарь, который содержит перечень номеров дней недели и их названий. Для облегчения чтения данных каждый элемент словаря размещается в отдельной строке.

Результат работы программы

Вид файла myfile6.txt

6. Чтение/запись двумерной матрицы целых чисел, представленной в виде списка

В примере демонстрируется запись и чтение двумерной матрицы целых чисел размерностью 3*4.

Результат работы программы

Вид файла myfile8.txt

7. Чтение/запись множества, которое содержит целые числа

В примере демонстрируется возможный вариант сохранения множества в текстовом файле

Результат работы программы

Вид файла myfile7.txt

8. Чтение/запись данных разных типов: список и кортеж

Чтобы записать в текстовый файл данные разных базовых типов нужно последовательно записать данные одного типа, затем другого типа. При считывании таких данных нужно придерживаться такого самого порядка чтобы не нарушить полученную структуру данных.

В примере демонстрируется последовательная запись в файл списка и кортежа. При чтении придерживается такая же последовательность: сначала читается список, затем кортеж. Список включает строки. Кортеж содержит вещественные числа. Чтобы облегчить работу по распознаванию формата файла, каждый записываемый (читаемый) элемент размещается в отдельной строке файла.
Поскольку список и кортеж могут содержать разное количество элементов, то в файл записываются их размерности.

Вывод без новой строки или пробела в Python

Статьи

Сегодня я рассмотрю различные способы печати значений без возврата символа новой строки или каретки. Это очень полезная статья!

Введение

Этого можно легко достичь, изменив значения по умолчанию параметров sep и end функции print.

Печать без новой строки

До версии Python 2.x, print было зарезервированным ключевым словом, которое действует как специальный оператор. Начиная с Python версии 3.x, команда print превратилась в функцию.

Эта версия print способна принимать следующие аргументы:

Print function - syntax

Интерпретатор выдаст следующее:

Теперь измените предыдущее утверждение так, чтобы оно выглядело следующим образом:

Выполнив его в интерпретаторе, вы получите результат, напоминающий:

Здесь произошло следующее: разделитель между двумя строками теперь также включает точку с запятой. Приглашение интерпретатора также появляется в той же строке, потому что мы удалили автоматически добавляемый символ новой строки.

Печать без новой строки в Python 2.X

Для более ранних версий Python (старше 3, но больше 2.6), вы можете импортировать print_function из модуля __future__. Это переопределит существующее ключевое слово print с помощью функции print, как показано ниже:

Вот как вы можете использовать функцию print от Python версии 3 в Python 2.x.

Использование stdout.write

Модуль sys имеет встроенные функции для записи непосредственно в файл или в TTY. Эта функция доступна для версий Python 2.x и 3.x. Мы можем использовать метод write объекта stdout модуля sys для печати на консоли следующим образом:

Хотя это дает результат того, чего мы пытаемся достичь, существует довольно много различий между функцией write и функцией print. Функция print может печатать несколько значений одновременно, может принимать нестроковые значения и более дружелюбна к разработчикам.

Заключение

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

Что такое эквивалент Python функции Perl chomp , который удаляет последний символ строки, если это символ новой строки?

Что такое «последний символ значения»? Что делает Chomp: удалить все завершающие новые строки или одну завершающую новую строку?

Попробуйте метод rstrip() (см. doc Python 2 и Python 3)

Метод Python rstrip() по умолчанию разделяет все виды конечных пробелов, а не одну новую строку, как Perl делает с chomp .

Чтобы удалить только символы новой строки:

Существуют также методы lstrip() и strip() :

Я не Python, поэтому у меня нет ответа на этот вопрос, но Perl chomp () фактически удаляет разделитель входных записей с конца. Это новая строка в Unixy, но может отличаться (например, Windows), и она изменчива. Есть ли способ удалить это значение только один раз из конца строки? Брайан Д. Фой: у Python нет разделителя входных записей, как у awk и Perl. \ N достаточно? >>> "тестовая строка \ r \ n" .rstrip ("\ n") "тестовая строка \ r" \ r сам по себе нигде не вызовет символ новой строки (кроме OSX, но кого волнует OSX?) @csde_rats, это не так: OS X использует \n для перевода строки, как и Unix. (До OS X MacOS использовал \r в качестве разделителя строк, но это закончилось 10 лет назад.) @skue: А как насчет Windows? Если вы удалите \n вы все равно получите \r . @AlixAxel Как указано выше @AlcubierreDrive, обработка переносимых строк означает, что они преобразуются в каноническую форму \n при чтении из файла. Тогда ваша программа, работающая со строками, никогда не увидит символы \r . Я знаю, что это на самом деле не вопрос, но это упоминается в комментариях. Есть ли какая-либо причина, по которой text.rstrip(os.linesep) не будет работать независимо от операционной системы для достижения этой цели? Я собираюсь продолжить и объяснить это, потому что я нуб, и я провел некоторое время, размышляя, почему это не работает. .strip() не изменяет строку (вероятно, имеет отношение к неизменным строкам). Если нет в командной строке, вам нужно "string = string.strip()" Сам по себе rstrip () доставит вам много головной боли, если вы обрабатываете TSV с пустыми столбцами. Например, "foo \ tbar \ t \ t \ n" .rstrip () удалит последние два пустых столбца из ваших данных.

И я бы сказал, что "pythonic" способ получить строки без конечных символов новой строки - splitlines().

Нет, если вы используете fd.readlines () или тому подобное.

Канонический способ стирания символов конца строки (EOL) заключается в использовании метода string rstrip(), удаляющего любые конечные \r или\n. Ниже приведены примеры символов Mac, Windows и Unix EOL.

Использование '\ r\n' в качестве параметра для rstrip означает, что оно будет лишать любую конечную комбинацию '\ r' или '\n'. Вот почему он работает во всех трех случаях выше.

Обратите внимание, что в отличие от функции Perl chomp это приведет к удалению всех указанных символов в конце строки, а не только к одному:

Читайте также: