单引号和双引号自动切换

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\')'

在这个例子中,Python对于元组的第一个元素进行了自动引号类型交换。当然,这是预期的,因为字符串中只出现了单引号。我的问题是,我正在尝试读取一个文件,其格式与上面打印的值完全相同,包括u、起始引号和结束引号。有没有办法读取文件并返回原始的s1元组?实际上,我甚至不需要元组,只需要其中的字符串。由于自动交换,我找到的任何编码/解码方案都不能正常工作。当然,我可以编写一个正则表达式或函数来解决这个问题,但一定有一种Python方法可以解决这个问题。此外,对于我来说,pickle或任何其他序列化都不是解决方案。感谢您的帮助。

3
在Python中,单引号和双引号在语法上是相同的。一个字符串用单引号表示还是用双引号表示,最终并没有实质性的影响。 - inspectorG4dget
2
你能激发保留这些引号差异的必要性吗? - BlackVegetable
1
你正在对从文件中读取的元组和字符串做什么? - Ella Sharakanski
1
unicode 函数期望的是一个字符串,但你提供了一个元组 (s1)。因此,在内部,unicode 可能会调用 str 函数来获取它的字符串表示形式。那么,你为什么不使用 [unicode(i) for i in s1] 来创建一个字符串列表,并使用 u', '.join() 将它们连接起来呢?这样就可以得到 s2 了。 - hitzg
1
当然我可以写一个正则表达式或函数来解决这个问题,但肯定有一种Python的方法可以做到这一点。为什么不编写一个正则表达式或函数并发布它,以便我们清楚地了解您想要的功能呢? - abcd
1
那是一种非常奇怪的文件格式。这个文件是如何创建的? - Robᵩ
2个回答

1

暂且不考虑引号的问题,让我们集中关注您真正的需求:

读取一个文件,其格式与上面打印出来的值完全相同,包括u、起始引号和结尾引号。... 实际上,我甚至不需要元组,只需要其中的字符串。

如果您有一个文件,其内容如下:

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

我不完全清楚你想要什么,但我写了一个脚本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\''

这两种方法有没有给你想要的结果?如果不是,你能解释一下它们与你想要的有什么不同吗?这可能会澄清问题,以便我们能够给出更好的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接