我正在使用以下内容从文本文件中读取一行:
file = urllib2.urlopen("http://192.168.100.17/test.txt").read().splitlines()
并在telnetlib.write命令中将其输出到LCD显示器,宽度为16个字符。如果读取的行超过16个字符,我想将其分解为16个字符长的字符串的部分,并在一定延迟(例如10秒)后将每个部分推出,一旦完成,代码应移到下一行输入文件并继续。
我已经尝试过搜索各种解决方案并阅读itertools等了但是我对Python的理解不足以让任何事情无法工作而不用很长时间的方式使用乱七八糟的if if else语句这可能会让我陷入困境!
对我来说,做我想做的最好的方法是什么?
答案 0 :(得分:42)
一种解决方案是使用此功能:
def chunkstring(string, length):
return (string[0+i:length+i] for i in range(0, len(string), length))
此函数使用生成器理解返回生成器。生成器返回切片的字符串,从0 +块的长度的倍数,到块的长度+块的长度的倍数。
您可以像列表,元组或字符串一样迭代生成器 - for i in chunkstring(s,n):
,或使用list(generator)
将其转换为列表(例如)。生成器比列表更有内存效率,因为它们在需要时生成元素,而不是一次生成元素,但是它们缺少索引等特定功能。
此生成器最后还包含任何较小的块:
>>> list(chunkstring("abcdefghijklmnopqrstuvwxyz", 5))
['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy', 'z']
使用示例:
text = """This is the first line.
This is the second line.
The line below is true.
The line above is false.
A short line.
A very very very very very very very very very long line.
A self-referential line.
The last line.
"""
lines = (i.strip() for i in text.splitlines())
for line in lines:
for chunk in chunkstring(line, 16):
print(chunk)
答案 1 :(得分:6)
我最喜欢的解决此问题的方法是使用re
模块。
import re
def chunkstring(string, length):
return re.findall('.{%d}' % length, string)
这里有一点需要注意:re.findall
不会返回小于长度值的块,因此会跳过任何余数。
但是,如果你正在解析固定宽度的数据,这是一个很好的方法。
例如,如果我想解析一个我知道由32个字节字符组成的文本块(如标题部分),我发现它非常易读,并且不需要将它概括为一个单独的函数(如chunkstring
):
for header in re.findall('.{32}', header_data):
ProcessHeader(header)
答案 2 :(得分:2)
我知道这是个老歌,但是想添加如何将可变长度的列切成字符串:
def chunkstring(string, lengths):
return (string[pos:pos+length].strip()
for idx,length in enumerate(lengths)
for pos in [sum(map(int, lengths[:idx]))])
column_lengths = [10,19,13,11,7,7,15]
fields = list(chunkstring(line, column_lengths))
答案 3 :(得分:0)
我认为这种方式更易于阅读:
string = "when an unknown printer took a galley of type and scrambled it to make a type specimen book."
length = 20
list_of_strings = []
for i in range(0, len(string), length):
list_of_strings.append(string[i:length+i])
print(list_of_strings)