2016-05-15 3 views
-2

Meine Datei zu lesen ist diese:Python: N Anzahl von Datei, M zum Zeitpunkt

14 
3 
21 
37 
48 
12 
4 
6 
22 
4 

Wie kann ich M-Nummer zum Zeitpunkt lesen? zum Beispiel 4 zur Zeit. Ist es notwendig, zwei für Schleifen zu verwenden?

Mein Ziel ist es (N/M) + 1-Listen innerhalb jeder List mit M-Nummern zu erstellen, mit Ausnahme der endgültigen Liste (es ist die Erinnerung an Teilung N/M)

+2

Haben Sie versucht, es mit zwei 'for' Schleifen zu implementieren? Das wäre ein guter Anfang, und wenn Sie Schwierigkeiten haben, können Sie um Hilfe bitten. – amiller27

+0

Ich habe meine Antwort bearbeitet. Bitte überprüfen. – SparkAndShine

Antwort

-1

Sie können Python-Liste slice Operator verwenden, um die Anzahl der benötigten Elemente aus einer Datei zu holen, indem Sie eine Datei mit readlines() lesen, wo jedes Element der Liste eine Zeile der Datei sein.

with open("filename") as myfile: 
    firstNtoMlines = myfile.readlines()[N:N+M] # the interval you want to read 
    print firstNtoMlines 
+0

Ich habe mit dieser Lösung versucht. Ich habe es in eine Weile Zyklus –

+0

hat es für Sie gearbeitet? – Tanu

+0

ja, es sollte funktionieren, mein Code ist in einem Beitrag über diesem –

-1

Dies vor gefragt wurde.

from itertools import izip_longest 
izip_longest(*(iter(yourlist),) * yourgroupsize) 

Für den Fall von 4 Zeilen in einer Datei in Listen der Größe Gruppierung:

with open("file.txt", "r") as f: 
    res = izip_longest(*(iter(f)),) * 4) 
    print res 

Alternative way to split a list into groups of n

0

Verwenden itertools.islice,

import itertools 
import math 

filename = 'test.dat' 
N = 9 
M = 4 

num_rest_lines = N 
nrof_lists = int(math.ceil(N*1.0/M)) 

with open(filename, 'r') as f: 
    for i in range(nrof_lists): 
     num_lines = min(num_rest_lines, M) 
     lines_gen = itertools.islice(f, num_lines) 

     l = [int(line.rstrip()) for line in lines_gen] 
     num_rest_lines = num_rest_lines - M 

     print(l)  
     # Output 
     [14, 3, 21, 37] 
     [48, 12, 4, 6] 
     [22] 

Vorherige Antwort: Iterate über eine Datei (N Zeilen) in Chunks (jede M Zeilen), bilden eine Liste von N/M+1 Listen.

import itertools 

def grouper(iterable, n, fillvalue=None): 
    """iterate in chunks""" 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(*args, fillvalue=fillvalue) 

# Test 
filename = 'test.dat' 
m = 4 
fillvalue = '0' 

with open(filename, 'r') as f: 
    lists = [[int(item.rstrip()) for item in chuck] for chuck in grouper(f, m, fillvalue=fillvalue)] 
    print(lists) 
    # Output 
    [[14, 3, 21, 37], [48, 12, 4, 6], [22, 4, 0, 0]] 
+0

Ich weiß nicht, warum iziip_longest Methode nicht erscheint, wenn ich itertools importiere. Ich benutze Anaconda. Ich kann es nicht anrufen –

+0

@LorenzoVannucchi, was ist der Fehler gemeldet? – SparkAndShine

+0

ich tippe "von itertools import ...", aber Eclispe findet izip_method nicht. Kein Fehler, nur diese –

0

Jetzt ist mein Code ist dieses:

N = 4 
M = 0 

while (M < 633): 
    with open("/Users/Lorenzo/Desktop/X","r") as myFile: 
     res = myFile.readlines()[M:N] 
     print(res) 
    M+=4 
    N+=4 

so, sollte es funktionieren. Meine Datei hat 633 Nummern

Verwandte Themen