假设以下代码(注意字符串中的逗号):
>>> a = ['1',",2","3,"]
我需要将值连接成一个字符串。天真的例子:
>>> b = ",".join(a)
>>> b
'1,,2,3,'
后来我需要再次拆分结果对象:
>>> b.split(',')
['1', '', '2', '3', '']
但是,我要找的结果是原始列表:
['1', ',2', '3,']
在此过程中保护逗号的最简单方法是什么?我提出的最佳解决方案看起来相当丑陋。
注意:逗号只是一个例子。字符串可以包含任何字符。我可以选择其他字符作为分隔符。
答案 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,']