38

我正在使用以下命令从文本文件中读取一行:

   file = urllib2.urlopen("http://192.168.100.17/test.txt").read().splitlines()

并在 telnetlib.write 命令中将其输出到 16 个字符宽的 LCD 显示器。如果读取的行长于 16 个字符,我想将其分解为 16 个字符长的字符串的部分,并在一定延迟(例如 10 秒)后将每个部分推出,一旦完成,代码应移至下一行输入文件并继续。

我已经尝试搜索各种解决方案并阅读 itertools 等,但我对 Python 的理解不足以让任何东西工作,而无需使用纠结的 if then else 语句以非常冗长的方式完成它可能会去给我打结!

什么是我做我想做的最好的方式?

4

4 回答 4

73

一种解决方案是使用此功能:

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)
于 2013-09-17T16:14:19.667 回答
9

我最喜欢的解决这个问题的方法是使用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)
于 2014-08-21T15:54:44.347 回答
3

我知道这是一个老歌,但想添加如何用可变长度列分割字符串:

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))
于 2019-01-09T20:44:18.430 回答
2

我认为这种方式更容易阅读:

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)
于 2020-10-04T18:26:38.937 回答