将非常长的字符串拆分为具有字符重叠的较小字符块

时间:2012-07-24 17:22:34

标签: python bash

我有一长串字符需要拆分成较小的块,但块需要重叠。输出字符串和重叠的长度应该是可变的。

示例:

在文本文件中以此开头:

-----------------------------------------------------

输出如下:

---------------------
---------------------
---------------------

3 个答案:

答案 0 :(得分:3)

我认为你的意思是:

def get_overlapped_chunks(textin, chunksize, overlapsize):  
    return [ textin[a:a+chunksize] for a in range(0,len(textin), chunksize-overlapsize)]

<强>解释

这里我使用列表推导,它只获取输出字符串应该从[0, step, 2*step,..., len(input)-chunksize] step = chunksize-overlapsize开始的索引,然后返回长度为chunksize的这些位置的文本。

用法

然后可以按如下方式使用此功能:

textin = ''.join(open(FILENAME, 'r').readlines()) # text as single line

CHUNKSIZE=10
OVERLAPSIZE = 2    

chunks = get_overlapped_chunks(textin, CHUNKSIZE, OVERLAPSIZE)

fout = open(FILEOUT, 'w')
fout.writelines(chunks)

答案 1 :(得分:2)

给定字符串s,您可以使用切片获取子序列:

>>> s = 'abcdefghijklmnopqrstuvwxyz'
>>> s[0:5]
'abcde'

其中切片为第5个字符提供第5个字符(但不包括第5个字符)。 range(start, end, step)函数提供的数字列表从start开始,最多end增加step

>>> range(0, len(s), 6)
[0, 6, 12, 18, 24]

将两者结合起来可以得到像

这样的东西
>>> for i in range(0, len(s), 6):
...     print s[i:i+8]
... 
abcdefgh
ghijklmn
mnopqrst
stuvwxyz
yz

因为切片操作是“宽容”,它仍会在最后一行产生一个简短的答案,而s[24:34]的字符少于8个。

答案 2 :(得分:0)

Pure Bash:

length=20
overlap=3

while read line ; do
  idx=0
  while [ $idx -lt ${#line} ] ; do
    echo "${line:idx:length}"
    ((idx+=length-overlap))
  done
done < "$infile"