It turns out the reuters data has standard held-out portions labelled in the SGML:
```bash
$ grep -ho '[A-Z]*SPLIT=[^ ]*' reut*.sgm | sort | uniq -c
 722 CGISPLIT="PUBLISHED-TESTSET"
20856 CGISPLIT="TRAINING-SET"
 722 LEWISSPLIT="NOT-USED"
6188 LEWISSPLIT="TEST"
14668 LEWISSPLIT="TRAIN"
```
Not that it makes it easy to use. The first 11 files are all training, then:
```
 134 reut2-012.sgm:CGISPLIT="PUBLISHED-TESTSET"
 866 reut2-012.sgm:CGISPLIT="TRAINING-SET"
 134 reut2-012.sgm:LEWISSPLIT="NOT-USED"
 866 reut2-012.sgm:LEWISSPLIT="TRAIN"

  22 reut2-013.sgm:CGISPLIT="PUBLISHED-TESTSET"
 978 reut2-013.sgm:CGISPLIT="TRAINING-SET"
  22 reut2-013.sgm:LEWISSPLIT="NOT-USED"
 978 reut2-013.sgm:LEWISSPLIT="TRAIN"

1000 reut2-014.sgm:CGISPLIT="TRAINING-SET"
 177 reut2-014.sgm:LEWISSPLIT="TEST"
 823 reut2-014.sgm:LEWISSPLIT="TRAIN"

1000 reut2-015.sgm:CGISPLIT="TRAINING-SET"
1000 reut2-015.sgm:LEWISSPLIT="TEST"

  66 reut2-016.sgm:CGISPLIT="PUBLISHED-TESTSET"
 934 reut2-016.sgm:CGISPLIT="TRAINING-SET"
  66 reut2-016.sgm:LEWISSPLIT="NOT-USED"
 934 reut2-016.sgm:LEWISSPLIT="TEST"

 406 reut2-017.sgm:CGISPLIT="PUBLISHED-TESTSET"
 594 reut2-017.sgm:CGISPLIT="TRAINING-SET"
 406 reut2-017.sgm:LEWISSPLIT="NOT-USED"
 593 reut2-017.sgm:LEWISSPLIT="TEST"
   1 reut2-017.sgm:LEWISSPLIT="TRAIN"

  94 reut2-018.sgm:CGISPLIT="PUBLISHED-TESTSET"
 906 reut2-018.sgm:CGISPLIT="TRAINING-SET"
  94 reut2-018.sgm:LEWISSPLIT="NOT-USED"
 906 reut2-018.sgm:LEWISSPLIT="TEST"

1000 reut2-019.sgm:CGISPLIT="TRAINING-SET"
1000 reut2-019.sgm:LEWISSPLIT="TEST"

1000 reut2-020.sgm:CGISPLIT="TRAINING-SET"
1000 reut2-020.sgm:LEWISSPLIT="TEST"

 578 reut2-021.sgm:CGISPLIT="TRAINING-SET"
 578 reut2-021.sgm:LEWISSPLIT="TEST"
```
If you want to adhere to these, I'm not sure you can do much  but parse the files multiple times.