保护连续的string.join()和string.split()上的逗号

时间:2012-01-17 13:04:38

标签: python

假设以下代码(注意字符串中的逗号):

>>> a = ['1',",2","3,"]

我需要将值连接成一个字符串。天真的例子:

>>> b = ",".join(a)
>>> b
'1,,2,3,'

后来我需要再次拆分结果对象:

>>> b.split(',')
['1', '', '2', '3', '']

但是,我要找的结果是原始列表:

['1', ',2', '3,']

在此过程中保护逗号的最简单方法是什么?我提出的最佳解决方案看起来相当丑陋。

注意:逗号只是一个例子。字符串可以包含任何字符。我可以选择其他字符作为分隔符。

6 个答案:

答案 0 :(得分:5)

  

字符串可以包含任何字符。

如果无论您使用什么作为分隔符,项目本身都可能包含分隔符,然后使用csv module

import csv

class PseudoFile(object):
    # http://stackoverflow.com/a/8712426/190597
    def write(self, string):
        return string
writer = csv.writer(PseudoFile())

这使用逗号连接a中的项目:

a = ['1',",2","3,"]
line = writer.writerow(a)
print(line)
# 1,",2","3,"

这会从a恢复line

print(next(csv.reader([line])))
# ['1', ',2', '3,']

答案 1 :(得分:2)

你是否必须使用昏迷来分隔物品?否则,您还可以使用列表项目中未使用的其他符号。

In [1]: '|'.join(['1', ',2', '3,']).split('|')
Out[1]: ['1', ',2', '3,']

编辑:字符串可能显然包含任何字符。是否可以使用json模块?你可以转储并加载列表。

In [3]: json.dumps(['1', ',2', '3,'])
Out[3]: '["1", ",2", "3,"]'

In [4]: json.loads('["1", ",2", "3,"]')
Out[4]: [u'1', u',2', u'3,']

编辑#2:如果您不能使用它,可以使用str.encode('string-encode')来转义字符串中的字符,然后将编码后的版本括在单引号中并将其与逗号分开:

In [10]: print "'example'".encode('string-escape')
\'example\' #' (have to close the opened string for stackoverflow

In [11]: print r"\'example\'".decode('string-escape')
'example'

编辑#3:运行str.encode('string-encode')的示例:

import re

def list_to_str(list):
    return ','.join("'{}'".format(s.encode('string-escape')) for s in list)

def str_to_list(str):
    return re.findall(r"'([^']*)'", str)

if __name__ == '__main__':
    a = ['1', ',2', '3,']
    b = list_to_str(a)
    print 'It is {} that this works.'.format(str_to_list(b) == a)

答案 2 :(得分:1)

当您将列表序列化为String时,您需要选择一个未出现在列表项中的字符作为分隔符。你不能用另一个角色替换逗号吗?

b = ";".join(a)
b.split(';')

答案 3 :(得分:1)

分隔符是否只需要一个字符?如果没有,那么你可以使用一个由一系列字符组成的分隔符,这些分隔符不会出现在你的字符串中,例如|#|或类似的东西。

答案 4 :(得分:1)

您需要转义逗号,并且可能还要转义转义序列。这是一种方式:

>>> a = ['1',",2","3,"]
>>> b = ','.join(s.replace('%', '%%').replace(',', '%2c') for s in a)
>>> [s.replace('%2c', ',').replace('%%', '%') for s in b.split(',')]
['1', ',2', '3,']
>>> b
'1,%2c2,3%2c'
>>> 

答案 5 :(得分:0)

我会使用除","以外的其他字符加入和拆分,例如";"

>>> b = ";".join(a)
>>> b.split(';')
['1', ',2', '3,']