什么';将字符串拆分为固定长度的块并在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)