2015-04-24 2 views
3

У меня возникла простая проблема с заменой котировок python (одиночными и двойными) на меня автоматически. Из-за этого я не могу вернуться к исходному тексту.Одиночные и двойные котировки Автоматическое переключение

Вот пример

s1 = ('foo\'bar' , 'bar\"foo', 'dead\'\"beef', 'beef\\\'\"dead') 
s2 = unicode(s1) 
print repr(s2) 
>>>u'("foo\'bar", \'bar"foo\', \'dead\\\'"beef\', \'beef\\\\\\\'"dead\')' 

В этом примере питона сделал автоматический обмен типов кавычек для первого элемента кортежа. Конечно, это ожидалось, поскольку в строке появились только одинарные кавычки. Проблема, которую я имею, я пытаюсь прочитать файл, который имеет формат, точно такой же, как напечатанное значение выше, включая u, стартовую цитату и трейлинг-цитату. Есть ли способ прочитать файл и вернуться к исходному корте s1. На самом деле, мне даже не нужен кортеж, только строки внутри. Нет схемы кодирования/декодирования, которую я нашел, работает правильно из-за автоматической подкачки. Конечно, я могу написать регулярное выражение или функцию, чтобы решить это, но должен быть способ python для этого. Также травление или любая другая сериализация не для меня.

заранее спасибо

+3

Одинарные и двойные кавычки синтаксически идентичны в Python. То, что строка представлена ​​одной цитатой, а не другой, в конечном счете несущественна – inspectorG4dget

+2

Можете ли вы мотивировать необходимость сохранения этих различий в цитатах? – BlackVegetable

+1

Что вы делаете с кортежами и строками, которые вы читаете из файла? –

ответ

1

Откладывая вопрос котировок на минуту, давайте сосредоточиться на реальной потребности:

прочитать файл, который имеет формат так же, как печатное выше, включая подводную, начиная цитаты , и трейлинг-цитату. ... На самом деле, я даже не нужно кортеж только строки внутри

Если у вас есть файл, содержимое которого выглядеть так:

u'("foo\'bar", \'bar"foo\', \'dead\\\'"beef\', \'beef\\\\\\\'"dead\')' 

Следующая программа будет вы получите доступ к строкам внутри:

import ast 
with open('x.txt') as input_file: 
    for line in input_file: 
     strings = ast.literal_eval(ast.literal_eval(line)) 
     # You can do whatever you want with the `strings` var, e.g: 
     assert(strings[0] == "foo'bar") 
     assert(strings[0] == 'foo\'bar') 
     print strings[0] 

Ссылка:

0

Это не 100% ясно мне, что вы хотите, но я написал сценарий test.py с двумя потенциальными решениями, один из которых является @ hitzg-х:

# @hitzg's solution: 
s1 = ('foo\'bar', 'bar\"foo', 'dead\'\"beef', 'beef\\\'\"dead') 
s2 = u', '.join([unicode(i) for i in s1]) 
print repr(s2) 

# My tweak, in case that's not quite what you want: 
s1 = ("'foo\'bar'", "'bar\"foo'", "'dead\'\"beef'", "'beef\\\'\"dead'") 
s2 = u', '.join([unicode(i) for i in s1]) 
print repr(s2) 

Вот выход этого сценария:

In [5]: run test.py 
u'foo\'bar, bar"foo, dead\'"beef, beef\\\'"dead' 
u'\'foo\'bar\', \'bar"foo\', \'dead\'"beef\', \'beef\\\'"dead\'' 

Предоставляет ли какой-либо из этих методов то, что вы хотите? Если нет, можете ли вы объяснить, как они отличаются от того, что вы хотите? Это может прояснить то, что мы можем дать вам лучший ответ.

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