什么';将字符串拆分为固定长度的块并在Python中使用它们的最佳方法是什么?
我正在使用以下命令读取文本文件中的一行:什么';将字符串拆分为固定长度的块并在Python中使用它们的最佳方法是什么?,python,Python,我正在使用以下命令读取文本文件中的一行: file = urllib2.urlopen("http://192.168.100.17/test.txt").read().splitlines() 并在telnetlib.write命令中将其输出到16个字符宽的LCD显示器。如果行读取长度超过16个字符,我希望将其分解为16个字符长的字符串,并在一定延迟(例如10秒)后将每个部分推出,一旦完成,代码应移到输入文件的下一行并继续 我尝试过搜索各种解决方案并阅读itertools等,但我对Py
file = urllib2.urlopen("http://192.168.100.17/test.txt").read().splitlines()
并在telnetlib.write命令中将其输出到16个字符宽的LCD显示器。如果行读取长度超过16个字符,我希望将其分解为16个字符长的字符串,并在一定延迟(例如10秒)后将每个部分推出,一旦完成,代码应移到输入文件的下一行并继续
我尝试过搜索各种解决方案并阅读itertools等,但我对Python的理解不足以让任何东西正常工作,而不使用一堆杂乱无章的if-then-else语句,这可能会让我陷入困境
对我来说,做我想做的事情的最佳方式是什么?一种解决方案是使用此功能:
def chunkstring(string, length):
return (string[0+i:length+i] for i in range(0, len(string), length))
此函数使用生成器返回生成器。生成器返回切片的字符串,从0+块长度的倍数,到块长度+块长度的倍数
您可以像列表、元组或字符串一样对生成器进行迭代-用于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)
我最喜欢的解决这个问题的方法是使用
re
模块
import re
def chunkstring(string, length):
return re.findall('.{%d}' % length, string)
这里需要注意的一点是,re.findall
不会返回小于长度值的块,因此会跳过任何剩余部分
但是,如果您正在解析固定宽度的数据,这是一种很好的方法
例如,如果我想解析一个由32字节字符组成的文本块(如页眉部分),我发现这非常可读,并且没有必要将其概括为单独的函数(如chunkstring
):
我知道这是一个老生常谈,但我想补充一下如何切碎具有可变长度列的字符串:
def chunkstring(字符串,长度):
返回(字符串[pos:pos+length].strip()
对于idx,枚举中的长度(长度)
对于[sum(map(int,length[:idx]))中的pos)
列长度=[10,19,13,11,7,7,15]
字段=列表(chunkstring(行、列长度))
我认为这种方式更容易阅读:
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)
尝试
import time
和time.sleep
延迟。若要分割成块,则chunks
函数应该可以工作。@mgilson我投票以重复方式关闭,因为答案是same@mgilsonMarcin——如果输入是字符串时,这个问题略有不同,您可以使用re
模块使用re.findall('.{%d}'%length,string)
@carl.anderson将其分块,当然可以。我不相信它会更快(虽然可能…),而且对我未经训练的眼睛来说,它肯定不容易阅读。我只是大致了解函数在做什么,但我仍然缺少一些内容,例如如何最好地使用生成的块。例如,我有“For line in file”,后面是更新显示的代码,后面是等待,但在移动到下一行之前,我应该如何逐步遍历每个块(即,我如何知道我有多少块并引用它们,例如,如果我使用“For I in chunkstring(s,n):“我如何“打印”块1或块3?”,没关系,我不太明白你的答案。我读了《易变函数和生成器》的解释,这帮助我认识到了我的错误。我没有看到你的编辑。谢谢,这也为我澄清了这一点@LostRob这太令人惊讶了,我编辑它是为了回应你的评论!很好的片段。尽管有名字,但没有任何限制它只限于字符串。很好。使用re.findall('.{1,%d}'%length,string)
可以包含一个不完整的最终块。从我做的几次timeit
运行来看,它可读性更强,但比常规切片慢50%。
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)