Mi código Python

import operator

with open('index.txt') as f:
    lines = f.read().splitlines()

print type(lines)
print len(lines)

l2=lines[1::3] 
print len(l2)
print l2[0]

list1 = [0,2]
my_items = operator.itemgetter(*list1)
new_list = [ my_items(x) for x in l2 ]

with open('newindex1.txt','w') as thefile:
    for item in l2:
        thefile.write("%s\n" % item)

Un par de líneas de index.txt

0 0 0
0 1 0
0 2 0
1 0 0
1 1 0
1 2 0
2 0 0
2 1 0
2 2 0
3 0 0

Un par de líneas de newindex1.txt

0 1 0
1 1 0
2 1 0
3 1 0
4 1 0
5 1 0
6 1 0
7 1 0
8 1 0
9 1 0

Quería leer el archivo como una lista, luego elegir cada tercera fila y finalmente seleccionar primero y la tercera columna de esa lista. Parece que no entiendo cómo funciona el operador.

Si intento con la solución Back2Basics, importo numpy como np

Myarray = np.fromfile ('index.txt', dtype = int, sep = '') anotherarray = myarray [:: 3] [0,2]

Tengo

  File "a12.py", line 4, in <module>
    anotherarray = myarray[::3][0,2]
IndexError: too many indices
1
Richard Rublev 9 may. 2016 a las 23:56

3 respuestas

La mejor respuesta

No necesita leer todos los datos en la memoria, puede usar itertools.islice para analizar las filas que desee y el csv lib para leer y escribir los datos:

from operator import itemgetter
from itertools import islice
import  csv

with open("in.txt") as f, open('newindex1.txt','w') as out:
    r = csv.reader(f, delimiter=" ")
    wr = csv.writer(out, delimiter=" ")
    for row in iter(lambda: list(islice(r, 0, 3, 3)), []):
        wr.writerow(map(itemgetter(0, 2), row)[0])
2
Padraic Cunningham 9 may. 2016 a las 21:27

Recomiendo encarecidamente usar numpy para esto. La razón es que todos estos datos numéricos se ajustan tan bien en la memoria. El código se ve así.

import numpy as np
myarray = np.fromfile('index.txt', dtype=int, sep=' ')
anotherarray = myarray[::3,::2]

Y luego quieres escribir el archivo

anotherarray.tofile('newfile.txt', sep=" ")

La forma en que se lee la línea de corte de matriz [::3,::2] es "tomar cada 3ra fila a partir de 0, y tomar cada otra columna a partir de 0"

1
Back2Basics 9 may. 2016 a las 21:20

Creo que necesitas algo esto?

lines = []

with open('index.txt', 'r') as fi:
    lines = fi.read().splitlines()

lines = [line.split() for line in lines]

with open('answer.txt', 'w') as fo:
    for column in range(len(lines)):
        if (column + 1) % 3:
            fo.write('%s %s\n' % (lines[column][0], lines[column][2]))
1
cmashinho 9 may. 2016 a las 21:22