我有一个文本文件,其中包含文档图像的像素值。开头与开头之间提到的数据结束标记由唯一的id,地面实况值和文档图像的每一行的特征向量组成。但是,我想将数据部分作为单位进行洗牌。任何人都可以指出一种方法,以便我可以随机化或随机播放这些数据吗?
===Begin==
TAG:0014/7_21
TRUTH:0020 0915 0941 091b 0020 0927 0940 092e 0940 0020 092a 095c 0940 0020 092a 0930 , 0020 092f 0939 093e 0901 0020 0909 0938 0947 0020 0905 0928 0947
FEATURE:14 32 256 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
===End==
===Begin==
TAG:0014/7_16
TRUTH:0020 0925 093e 0020 0914 0930 0020 091a 093e 0939 0924 093e 0020 0925 093e 0020 0915 093f 0020 0906 091c 0020 0915 0947 0020 091c 092e 093e 0928
FEATURE:19 32 43 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
===END===
...
...
等等。
我需要在BEGIN和END标签之间混洗整个内容。
答案 0 :(得分:0)
我假设部分分隔符应该是统一的,并且问题中给出的数据中分隔符的变化是错别字。
一旦我们将数据拆分为多个部分,就可以轻松地对这些部分进行混洗。我创建了一些包含5个部分的虚假数据来说明这个过程。
src = '''\
===Begin===
TAG:0014/7_29
TRUTH:019e 0078 02fc 0790 0552 0d01 0f8a 0f67 06d7 0cd5
FEATURE:229 81 20 0 1 1 1 1 1 1 0 0 1 0 0 0
===End===
===Begin===
TAG:0014/7_06
TRUTH:0a09 01d4 019a 0f41 0509 01d1 0290 05f2 0231 022c
FEATURE:214 97 4 0 0 0 1 1 1 0 1 0 1 1 0 1
===End===
===Begin===
TAG:0014/7_05
TRUTH:0ea1 0a1e 0252 004c 0eaa 0333 0258 06d2 087c 043d
FEATURE:25 15 153 1 1 0 1 1 0 1 0 0 1 0 0 0
===End===
===Begin===
TAG:0014/7_01
TRUTH:08b7 0904 06bd 0af8 0683 0872 0fa2 0809 01a0 02f4
FEATURE:178 101 78 0 1 0 1 0 1 1 0 0 0 0 0 1
===End===
===Begin===
TAG:0014/7_19
TRUTH:04bd 0dc0 0414 0156 09dd 0bab 0146 0b73 06b8 07fc
FEATURE:202 74 248 0 0 0 0 1 0 0 1 1 0 1 0 0
===End===
'''
from random import seed, shuffle
# seed randomizer so we can get reproducible results
seed(42)
# Split data into sections
data = []
section = []
src_lines = iter(src.splitlines(True))
for line in src_lines:
section.append(line)
if line.startswith('===End==='):
data.append(section)
section = []
# Skip any extra blank lines between sections
for line in src_lines:
if line and not line.isspace():
section.append(line)
break
shuffle(data)
for sec in data:
print(''.join(sec))
<强>输出强>
===Begin===
TAG:0014/7_01
TRUTH:08b7 0904 06bd 0af8 0683 0872 0fa2 0809 01a0 02f4
FEATURE:178 101 78 0 1 0 1 0 1 1 0 0 0 0 0 1
===End===
===Begin===
TAG:0014/7_06
TRUTH:0a09 01d4 019a 0f41 0509 01d1 0290 05f2 0231 022c
FEATURE:214 97 4 0 0 0 1 1 1 0 1 0 1 1 0 1
===End===
===Begin===
TAG:0014/7_05
TRUTH:0ea1 0a1e 0252 004c 0eaa 0333 0258 06d2 087c 043d
FEATURE:25 15 153 1 1 0 1 1 0 1 0 0 1 0 0 0
===End===
===Begin===
TAG:0014/7_19
TRUTH:04bd 0dc0 0414 0156 09dd 0bab 0146 0b73 06b8 07fc
FEATURE:202 74 248 0 0 0 0 1 0 0 1 1 0 1 0 0
===End===
===Begin===
TAG:0014/7_29
TRUTH:019e 0078 02fc 0790 0552 0d01 0f8a 0f67 06d7 0cd5
FEATURE:229 81 20 0 1 1 1 1 1 1 0 0 1 0 0 0
===End===
该行
src_lines = iter(src.splitlines(True))
允许我们迭代src
字符串中的行,就好像我们在文件中的行上进行迭代一样。要在实际文件上使用此代码,请用
with open(filename) as src_lines:
并缩进for line in src_lines:
块,使其位于with
块内。