我有一长串字符需要拆分成较小的块,但块需要重叠。输出字符串和重叠的长度应该是可变的。
示例:
在文本文件中以此开头:
-----------------------------------------------------
输出如下:
---------------------
---------------------
---------------------
答案 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"