如何在文本文件中混洗数据部分?

时间:2017-01-15 10:26:01

标签: python

我有一个文本文件,其中包含文档图像的像素值。开头与开头之间提到的数据结束标记由唯一的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标签之间混洗整个内容。

1 个答案:

答案 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块内。