我有一长串字符需要拆分成更小的块,但是这些块需要重叠。输出字符串的长度和重叠应该是可变的。
例子:
从文本文件开始:
-----------------------------------------------------
输出是这样写的:
---------------------
---------------------
---------------------
我认为你的意思是:
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]
where开始的索引,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)
给定一个字符串s
,你可以使用slices得到一个子序列:
>>> s = 'abcdefghijklmnopqrstuvwxyz'
>>> s[0:5]
'abcde'
其中切片为您提供第 0 个字符,直到(但不包括)第 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]
.
纯重击:
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"