2017-04-05 1 views
0

J'essaie de parcourir un grand modèle numérique d'élévation (MNA) et de créer de nouveaux fichiers texte avec des contenus de 4 000 en utilisant Python. Ci-dessous est le code pour itérer dans un fichier ligne par ligne, mais je voudrais augmenter le nombre de lignes écrites dans un nouveau fichier. Toute aide serait grandement appréciée.Utilisation de Python pour effectuer une itération à l'aide d'un grand DEM

import pandas as pd 
import numpy as np 

#Read in File 
df1 = pd.read_table('Large_DEM_File.txt', skiprows=6, chunksize=500) 

df = pd.concat(df1) 
rows = 320000 
y= -1003.00 
delta = 0.00025 
linecount= 4001 

#initialize counter 
i = 0 
while i <= rows: 
    for i, row in df.iterrows(): 
     filename = open(str(i)+'.txt','w') 
     filename.write("ncols 136000\nrows 320000\nxllcorner 122\n") 
     filename.write("yllcorner %.5f" %(y+rows*delta-(i+1)*delta)) 
     filename.write("\ncellsize 0.00025\nNODATA_value -9999\n") 
     filename.write(row[0:4000+i]) 
     i += 4000 

Répondre

0

Je n'ai pas vos données et je suis un peu confus ce que vous essayez de faire, mais est-ce que vous obtenez ce que vous voulez?

rows = 320000 
y= -1003.00 
delta = 0.00025 

df_chunk_reader = pd.read_table('Large_DEM_File.txt', skiprows=6, chunksize=500) 

for i,chunk in enumerate(df_chunk_reader): 

    filename = open(str(i)+'.txt','wb') 
    filename.write("ncols 136000\nrows 320000\nxllcorner 122\n") 
    filename.write("yllcorner %.5f" %(y+rows*delta-(i+1)*delta)) 
    filename.write("\ncellsize 0.00025\nNODATA_value -9999\n") 
    filename.write(chunk) 

Voir ici pour plus sur le traitement dataframes par morceau: http://pandas.pydata.org/pandas-docs/stable/io.html#iterating-through-files-chunk-by-chunk

+0

Énumérer est une grande fonction, mais il ne fonctionne pas toujours bien avec de grandes données. Mon but ultime est d'itérer à travers de grandes données (DEM ascii) sans stocker les données, et segmenter les grandes données dans une mémoire plus digeste pour un calcul plus poussé. J'ai entendu dire que xrange est un moyen possible, mais je n'ai pas beaucoup d'expérience en utilisant cette fonction. – FlyTheW

+0

la différence principale entre mon code ci-dessus et le vôtre n'est pas énumérer, c'est le traitement par morceaux. df_chunk_reader dans mon code est un générateur (comme xrange), mais donnera un morceau de votre ensemble de données à la fois. De cette façon, vous pouvez traiter les données comme vous le souhaitez, par morceaux. la taille des morceaux peut être ce que vous voulez, déterminée par le paramètre chunksize. –

+0

dans votre code de question, vous avez également df1 qui est un générateur qui génère un morceau de votre ensemble de données à la fois. mais au lieu de le traiter par morceaux, votre code concatène tous les morceaux, puis le traite ligne par ligne. Si je comprends bien votre question, vous devriez plutôt la traiter par morceaux comme dans mon code de réponse ci-dessus. –