有没有办法在不生成新字符串的情况下拆分python字符串?

有没有办法在不生成新字符串的情况下拆分python字符串?,python,string,Python,String,输入是一个包含大量字符的字符串,我希望将该字符串拆分为一个带有特殊分隔符的字符串列表 但我想,简单地使用split将生成新字符串,而不是拆分原始输入字符串本身,在这种情况下,它会消耗大量内存(保证不再使用原始字符串) 那么有没有一种方便的方法来进行这种破坏性的分裂呢 情况如下: input_string = 'data1 data2 <...> dataN' output_list = ['data1', 'data2', <...> 'dataN'] input_st

输入是一个包含大量字符的字符串,我希望将该字符串拆分为一个带有特殊分隔符的字符串列表

但我想,简单地使用
split
将生成新字符串,而不是拆分原始输入字符串本身,在这种情况下,它会消耗大量内存(保证不再使用原始字符串)

那么有没有一种方便的方法来进行这种破坏性的分裂呢

情况如下:

input_string = 'data1 data2 <...> dataN'
output_list = ['data1', 'data2', <...> 'dataN']
input_string='data1 data2 dataN'
输出列表=['data1','data2','dataN']
我希望输出列表中的
data1
与输入字符串中的
data1
(以及所有其他)共享相同的内存区域


顺便说一句,对于每个输入字符串,大小为10MB-20MB;但是因为有很多这样的字符串(大约100个),所以我想这里应该考虑内存消耗?

在Python中,字符串是不可变的。这意味着任何更改字符串的操作都将创建一个新字符串。如果您担心内存问题(尽管除非您处理的是巨大的字符串,否则这应该不是什么大问题),您可以始终使用新的、修改过的字符串覆盖旧字符串,并替换它

不过,您描述的情况略有不同,因为
split
的输入是一个字符串,而输出是一个字符串列表。它们是不同的类型。在这种情况下,我只需创建一个包含
split
输出的新变量,然后将旧字符串(即split函数的输入)设置为
None
,因为您保证它不会再次使用

代码:


唯一的替代方法是使用切片而不是
split
访问子字符串。您可以使用
str.find
查找每个分隔符的位置。然而,这将是缓慢而微妙的。如果您可以使用split并使原始字符串退出范围,那么这将是值得的


你说这个字符串是输入的,所以你可能会考虑阅读少量的字符,这样你就可以处理更多的可管理块。您真的需要同时在内存中存储所有数据吗?

也许python的方法是使用迭代器?这样,新的子字符串一次只在内存中出现一个。基于 :


这可以很好地工作,不会导致内存问题。

如果您谈论的字符串太大,以至于您无法忍受将它们放入内存,那么可能会对字符串运行一次(O(n),可能可以使用
str.find改进,但我不确定)那么存储一个包含
切片
对象的生成器会更节省内存吗

long_string = "abc,def,ghi,jkl,mno,pqr" # ad nauseum
splitters = [','] # add whatever you want to split by
marks = [i for i,ch in enumerate(long_string) if ch in splitters]
slices = []
start = 0
for end in marks:
    slices.append(slice(start,end))
    start = end+1
else:
    slices.append(slice(start,None))

split_string = (long_string[slice_] for slice_ in slices)

comline=“foo bar”com=commline.split(“”)print(com[0])将导致“foo”,因此字符串拆分将实际生成一个列表。您的猜测基于什么?我认为在python2和python3中生成一个
list
。“大量字符”-我们谈论的有多大?兆字节Gb?@HongxuChen--MB现在真的没什么大不了的。我的建议是只使用
.split()
,不要担心它。您的内存消耗将增加一倍——如果字符串为10-20MB,您将使用大约40MB的内存。这几天真的不错。当垃圾收集器能够清理时,让它在您之后清理。:-)是否有任何字符串包装器(即
mutable
string)来执行字符串修改操作?@HongxuChen Python中没有可变字符串。我不知道为什么这对你如此重要。您的字符串有多大?@AdamSmith约10-20MB;我真的需要考虑内存消耗吗?我不需要所有的数据在同一时间,但应该能够用于迭代后。我从来没有找到机会使用它,但也许也会有帮助…
import re
string_long = "my_string " * 100000000 # takes some memory
# strings_split = string_long.split()  # takes too much memory
strings_reiter = re.finditer("(\S*)\s*", string_long) # takes no memory
for match in strings_reiter:
    print match.group()
long_string = "abc,def,ghi,jkl,mno,pqr" # ad nauseum
splitters = [','] # add whatever you want to split by
marks = [i for i,ch in enumerate(long_string) if ch in splitters]
slices = []
start = 0
for end in marks:
    slices.append(slice(start,end))
    start = end+1
else:
    slices.append(slice(start,None))

split_string = (long_string[slice_] for slice_ in slices)