Using Python to break a continuous string into components?
这与我想做的类似:将一个32位数字拆分为各个字段
这是我典型的"字符串"00000000 110000000011100000000
我需要把它分成四等份:
00000000
一千一百万
00000 110
00000000
我需要将列表附加到一个新的文本文件中,并将原始字符串作为标题。
如果有空格等分隔符,我知道如何拆分字符串,但我的字符串是连续的。
这些可以被认为是32位和8位二进制数字,但它们只是文本文件中的文本(目前)!
我对用python编程是全新的,所以,我需要病人的详细信息,而不是概括。
别以为我知道什么。
谢谢您,
拉尔夫
这应该是你想要的。更多细节见理解。
1 2 3
| >>> s ="00000000110000000000011000000000"
>>> [s[i:i+8] for i in xrange(0, len(s), 8)]
['00000000', '11000000', '00000110', '00000000'] |
- 谢谢,但什么是['00000000'、'110000000'、'00000110'、'00000000']?
- 这是一个"列表",包含固定位置的字符串。例如,‘mylist=['00000000'、'11000000'、'00000110'、'00000000']` mylist[0]将为您提供第一个元素。也可以在这里和这里看到
+罗伯特的回答是1。至于"我需要将列表附加到以原始字符串作为标题的新文本文件中":
1 2 3 4
| s ="00000000110000000000011000000000"
s += '
' + '
'.join(s[i:i+8] for i in xrange(0, len(s), 8)) |
将给予
1 2 3 4 5
| '00000000110000000000011000000000
00000000
11000000
00000110
00000000' |
因此,把每个"字节"放在一个单独的行上,正如我从你的问题中所理解的那样…
编辑:一些有助于您理解的注释:列表[](见这里)包含您的数据,在本例中,是在括号之间的字符串。列表中的第一项检索方式如下:
在Python中,字符串本身也是一个对象,具有您可以调用的特定方法。因此,'
'(表示回车)是"string"类型的对象,您可以使用列表作为参数调用它的方法join():
然后,列表中的元素与每个元素之间的字符串'
'一起"连接"。结果不再是一个列表,而是一个字符串。两个字符串可以加在一起,因此
1 2 3
| s += '
' + '
'.join(mylist) |
加上s(它已经是一个字符串),右边部分本身就是字符串的"和"。(我希望能澄清一些事情?)
- 谢谢Remi,以"00000000 1100000000 11000 11000"为例,字符串需要从文本文件中读取,所以我想
- 对于长文件,您可以一次读取32位字符串:使用open("data.txt")作为f:a2=f.read(3)bits=f.read(33).strip()(该.strip()去掉了尾随空格)
以下是将字符串拆分为等长部分的几种替代方法,供参考:
1 2 3 4 5 6
| >>> import re
>>> re.findall(r'.{1,8}', s, re.S)
['00000000', '11000000', '00000110', '00000000']
>>> map(''.join, zip(*[iter(s)]*8))
['00000000', '11000000', '00000110', '00000000'] |
这里记录了将一个序列分成n个长度组的zip方法,但它只适用于长度可被n平均整除的字符串(对于这个特定问题,这不是一个问题)。如果字符串长度不能被n整除,可以使用itertools.izip_longest(*[iter(s)]*8, fillvalue='')。
- 如果我有['00000000'、'110000000'、'00000110'、'00000000']为什么我需要问这个问题?我不明白当你使用"["00000000"、"110000000"、"00000110"、"00000000"]时所说的是什么?在解析文件中的行之前,字符组成将是未知的。或者['00000000'、'110000000'、'00000110'、'00000000']是预期产量吗?谢谢拉尔夫
使用索引操作符[]可以中断字符串、列表和touple。使用索引操作符内部的:操作符,可以在那里实现字段。尝试以下方法:
1 2
| x ="00000000110000000000011000000000"
part1, part2, part3, part4 = x[:8], x[8:16], x[16:24], x[24:] |
- 感谢大家,索引操作符[]和:操作符似乎是键!!我需要分析一个带有模式的文本文件,典型的模式是:a1 0000000000000 1110000000000000000000000000000 11111 0000000000000000000000000 110001000000000 110001000000000 11000110001000000000 110001000000000 110000000000000 110001100010000 1100000000 11111111111111 00000000000000000000 1111111111111 00000000000000000000 1100000000 1100010000 1100010000 1100000000 1100000000 11100000 1111111100000000 110000000011100000000 1000000000110000000010000000 10000000001100000000110000000011000000001100000000110000000011000000001100000000110000000011000
- 好的,确保检查可用的字符串方法;知道它们是电源…例如,s.split()将把您的模式拆分到空格上,从而得到32位字符串的列表!
你需要一个子串
1 2 3 4 5
| x = 01234567
x0 = x[0:2]
x1 = x[2:4]
x2 = x[4:6]
x3 = x[6:8] |
因此,X0将保持"01",X1将保持"23"等。
- 是的,谢谢凯文蒂姆,这很好也很简单。我将不得不解析该文件来填充X。处理输出并读取下一行,然后再次执行。拉尔夫