Как убрать n python при чтении из файла
Правильная вещь - использовать код «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.
Функция 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:57unicode_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. Чтение/запись данных разных типов: список и кортеж
Чтобы записать в текстовый файл данные разных базовых типов нужно последовательно записать данные одного типа, затем другого типа. При считывании таких данных нужно придерживаться такого самого порядка чтобы не нарушить полученную структуру данных.
В примере демонстрируется последовательная запись в файл списка и кортежа. При чтении придерживается такая же последовательность: сначала читается список, затем кортеж. Список включает строки. Кортеж содержит вещественные числа. Чтобы облегчить работу по распознаванию формата файла, каждый записываемый (читаемый) элемент размещается в отдельной строке файла.
Поскольку список и кортеж могут содержать разное количество элементов, то в файл записываются их размерности.
Сегодня я рассмотрю различные способы печати значений без возврата символа новой строки или каретки. Это очень полезная статья!
Введение
Этого можно легко достичь, изменив значения по умолчанию параметров sep и end функции print.
Печать без новой строки
До версии Python 2.x, print было зарезервированным ключевым словом, которое действует как специальный оператор. Начиная с Python версии 3.x, команда print превратилась в функцию.
Эта версия print способна принимать следующие аргументы:
Интерпретатор выдаст следующее:
Теперь измените предыдущее утверждение так, чтобы оно выглядело следующим образом:
Выполнив его в интерпретаторе, вы получите результат, напоминающий:
Здесь произошло следующее: разделитель между двумя строками теперь также включает точку с запятой. Приглашение интерпретатора также появляется в той же строке, потому что мы удалили автоматически добавляемый символ новой строки.
Печать без новой строки в 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 это приведет к удалению всех указанных символов в конце строки, а не только к одному:
Читайте также: