2016-03-22 15 views
0

Geniş bir metin dosyasına (yaklaşık 44MB) sahibim ve bilgisayarımın belleğini ifşa etmeden okumak ve filtrelemeye çalışıyorum. Metin dosyası, her bir sütun farklı hava değişkenlerini temsil eden virgülle ayrılmış ve her bir satır, zaman içindeki değerlerini temsil eder. Sadece rüzgar yönünün 10 ila 100 derece olduğu satırları seçmek ve sonra bu satırları yeni bir dosyaya yazmak istiyorum (txt dosyası veya csv iyi olurdu). Ben tam bir python noob'um, bu yüzden herhangi bir yardım çok takdir edilecektir!Python'da txt dosyası okuma, bir değerin belirli bir aralık içinde yer aldığı satırları seçme, csv'ye yazma

verilerine

hd,Station Number,Year Month Day Hours Minutes in YYYY,MM,DD,HH24,MI format in Local time,Year Month Day Hours Minutes in YYYY,MM,DD,HH24,MI format in Local standard time,Year Month Day Hours Minutes in YYYY,MM,DD,HH24,MI format in Universal coordinated time,Precipitation since last (AWS) observation in mm,Quality of precipitation since last (AWS) observation value,Air Temperature in degrees Celsius,Quality of air temperature,Air temperature (1-minute maximum) in degrees Celsius,Quality of air temperature (1-minute maximum),Air temperature (1-minute minimum) in degrees Celsius,Quality of air temperature (1-minute minimum),Wet bulb temperature in degrees Celsius,Quality of Wet bulb temperature,Wet bulb temperature (1 minute maximum) in degrees Celsius,Quality of wet bulb temperature (1 minute maximum),Wet bulb temperature (1 minute minimum) in degrees Celsius,Quality of wet bulb temperature (1 minute minimum),Dew point temperature in degrees Celsius,Quality of dew point temperature,Dew point temperature (1-minute maximum) in degrees Celsius,Quality of Dew point Temperature (1-minute maximum),Dew point temperature (1 minute minimum) in degrees Celsius,Quality of Dew point Temperature (1 minute minimum),Relative humidity in percentage %,Quality of relative humidity,Relative humidity (1 minute maximum) in percentage %,Quality of relative humidity (1 minute maximum),Relative humidity (1 minute minimum) in percentage %,Quality of Relative humidity (1 minute minimum),Wind (1 minute) speed in km/h,Wind (1 minute) speed quality,Minimum wind speed (over 1 minute) in km/h,Minimum wind speed (over 1 minute) quality,Wind (1 minute) direction in degrees true,Wind (1 minute) direction quality,Standard deviation of wind (1 minute),Standard deviation of wind (1 minute) direction quality,Maximum wind gust (over 1 minute) in km/h,Maximum wind gust (over 1 minute) quality,Visibility (automatic - one minute data) in km,Quality of visibility (automatic - one minute data),Mean sea level pressure in hPa,Quality of mean sea level pressure,Station level pressure in hPa,Quality of station level pressure,QNH pressure in hPa,Quality of QNH pressure,# 
hd, 40842,2000,03,20,10,50,2000,03,20,10,50,2000,03,20,00,50,  ,N, 25.7,N, 25.7,N, 25.6,N, 21.5,N, 21.5,N, 21.4,N, 19.2,N, 19.2,N, 19.0,N, 67,N, 68,N, 66,N, 13,N, 9,N,100,N, 4,N, 15,N,  ,N,1018.6,N,1017.5,N,1018.6,N,# 
hd, 40842,2000,03,20,10,51,2000,03,20,10,51,2000,03,20,00,51, 0.0,N, 25.6,N, 25.8,N, 25.6,N, 21.5,N, 21.6,N, 21.5,N, 19.2,N, 19.4,N, 19.2,N, 68,N, 68,N, 66,N, 11,N, 9,N,107,N, 11,N, 13,N,  ,N,1018.6,N,1017.5,N,1018.6,N,# 
hd, 40842,2000,03,20,10,52,2000,03,20,10,52,2000,03,20,00,52, 0.0,N, 25.8,N, 25.8,N, 25.6,N, 21.7,N, 21.7,N, 21.5,N, 19.5,N, 19.5,N, 19.2,N, 68,N, 69,N, 66,N, 11,N, 9,N, 83,N, 13,N, 13,N,  ,N,1018.6,N,1017.5,N,1018.6,N,# 

bu

import csv 

with open("X:\hd_040842_2000_03.txt") as input, open("X:\wanted.txt", "w") as wanted, open("X:\unwanted.txt", "w") as unwanted: 
    reader = csv.DictReader(input, delimiter=",") 
    fieldnames = reader.fieldnames 
    writer_wanted = csv.DictWriter(college, fieldnames, delimiter=",") 
    writer_unwanted = csv.DictWriter(adult, fieldnames, delimiter=",") 
    writer_wanted.writeheader() 
    writer_unwanted.writeheader() 
    for row in reader: 
     if float(row["Wind (1 minute) direction in degrees true"]) > 10.0 and float(row["Wind (1 minute) direction in degrees true"]) < 110.0: 
      writer_college.writerow(row) 
     else: 
      writer_adult.writerow(row) 

Yani bildiğiniz bir NULL BYTE hata mesajı üretir tutar benim en iyi koddur numunesi, Elimden gelen olabilir bu kodu adapte Bu gönderi Use Python to select rows with a particular range of values in one column

+3

Lütfen metin dosyanızın bir bölümünü ve denediğiniz kodu yazınız! – Signal

+0

Ayrıca bir stackoverflow noob olduğunu görüyorum. Her ikisi de iyiler; noobs burada bekliyoruz! Fakat iyi bir cevap almak istiyorsanız, sorunuzda daha fazla ayrıntıya ihtiyacınız var. Sinyal önerildiği gibi, en azından bir kod oluşturmaya çalışmalısınız. Ayrıca, metin dosyanızın ne olduğunu bilmemiz gerekiyor. Bir başlık var mı? Bazı sütun dizeleri mi yoksa hepsi sayısal mu? 44 MB'ı belleğe sığdırmayacak mısın? Bu detayların herhangi bir cevap üzerinde büyük etkileri olacaktır. – Mike

+1

Oldukça düz ileri. Csvs okuma ve yazma örnekleri bulun. Okuyucuda satır için bir döngü olmalı: '(readlines' yapmakta kötü olanlardan kaçının). Satırları okurken, istediğiniz satır öğesinin durumunu kontrol edip kötü olanları atlarsınız. – tdelaney

cevap

1

csv dosyalarıyla çalışırken (Python 2.x içinde) dosyayı rb modunu kullanarak açmanız gerekir. İkincisi, verileriniz hücrelerde birçok önemli alan içerdiğinden, skipinitialspace=True parametresini eklemeyi öneririm.Son olarak, yayınlanan kod hala onu kopyalayarak etmişti gelen değişiklikler üzerinde bazı sol vardı, şu sağladığınız veriler için çalışmak görünür:

import csv 

with open(r"X:\hd_040842_2000_03.txt", "rb") as input, open(r"X:\wanted.txt", "wb") as wanted, open(r"X:\unwanted.txt", "wb") as unwanted: 
    reader = csv.DictReader(input, delimiter=",", skipinitialspace=True) 
    fieldnames = reader.fieldnames 
    writer_wanted = csv.DictWriter(wanted, fieldnames, delimiter=",") 
    writer_unwanted = csv.DictWriter(unwanted, fieldnames, delimiter=",") 
    writer_wanted.writeheader() 
    writer_unwanted.writeheader() 

    for row in reader: 
     if 10.0 <= float(row["Wind (1 minute) direction in degrees true"]) <= 110.0: 
      writer_wanted.writerow(row) 
     else: 
      writer_unwanted.writerow(row) 

Not Hala sorun alıyorsanız eğer, sonra bazı teşhis ekleyin:

import csv 

with open(r"X:\hd_040842_2000_03.txt", "rb") as input, open(r"X:\wanted.txt", "wb") as wanted, open(r"X:\unwanted.txt", "wb") as unwanted: 
    reader = csv.DictReader(input, delimiter=",", skipinitialspace=True) 
    fieldnames = reader.fieldnames 
    writer_wanted = csv.DictWriter(wanted, fieldnames, delimiter=",") 
    writer_unwanted = csv.DictWriter(unwanted, fieldnames, delimiter=",") 
    writer_wanted.writeheader() 
    writer_unwanted.writeheader() 

    for line_number, row in enumerate(reader, start=1): 
     try: 
      if 10.0 <= float(row["Wind (1 minute) direction in degrees true"]) <= 110.0: 
       writer_wanted.writerow(row) 
      else: 
       writer_unwanted.writerow(row) 
     except: 
      print "Failed to parse line", line_number 
      print row 

Bu sorun nerede olduğunu araştırmak, böylece bir soruna neden herhangi satır satır numarası ve satır gösterecektir.

+0

harika! Bilgisayarıma döndüğümde bunu kontrol edeceğim! Böyle belirsiz bir soruyu cevapladığınız için teşekkürler. Ben bir stackoverflow noob'um, ama bu yana, sorumu daha spesifik olmak için güncelledim. Teşekkürler Martin! –

+0

Çalıştırdım! Yardımın için çok teşekkürler! birkaç istisna vardı, ama hayatım boyunca bu satırların neyin yanlış olduğunu anlayamıyorum. Bu sırada sadece bu satırları görmezden gelebilecek kadar az istisna vardır, analiz üzerinde dikkate değer bir etki olmamalıdır. –

+0

Sevindim çalışıyor. Söylemeyi unuttum, bildirilen satır sayısı 0'dan sayılıyordu. Bunu 1'den saymaya karar verdim. Cevabınızdan memnunsanız, yanındaki gri tıklamayı kabul etmeyi unutmayın. çözüm. –

0

Yalnızca en az veri analizi yapmaktan daha fazlasını yaptığınız her zaman, numpy veyagibi bir paket kullanmak istersiniz. Bunlar, herkesin veri analizi için python'da kullandığı ana paketler; Tüm bu şeyleri kendi başınıza kodlamak için çok hızlı bir şekilde karmaşıklaşır. Genel olarak, numpy kullanımı daha kolaydır, ancak daha sıkı bir şekilde odaklanmıştır. Diğer taraftan, verileriniz dizeleri içerdiğinde pandas çok daha iyidir. Bunu yapmanın iki yolunu göstereceğim.

Pandalar

Önce

sadece dosyada okundu. Daha sonra, minimum ve maksimum koşullarınızın karşılandığı satırları bulabilirsiniz. Bu koşulları & ile birleştirin ve bakmak istediğiniz satırları seçmek için bunu kullanın. Son olarak, verileri tekrar dosyaya yazabilirsiniz. Tabi ki, onu da çizebilirsin, ya da her neyse. Numpy

import pandas as pd 
data = pd.read_csv('weather_in.csv') 
min_indices = (data['Wind (1 minute) direction in degrees true'] >= 10) 
max_indices = (data['Wind (1 minute) direction in degrees true'] <= 100) 
data = data[min_indices & max_indices] 
data.to_csv('weather_out.csv') 

[cevap metin içeren gelmez CSV bir örnek göstermek için güncellendi. Bu durumda, pandas, numpy yerine gitmek için yoldur. Sadece

İşte CSV sadece sayısal değerleri içeren varsayarak, bunu yapmak için kolay bir yoldur]. numpy kullanımı daha kolay olduğu durumlar için ne yapacağını göstermek için bu bırakacağım ve belleğe 44MB yükleyebilirsiniz .. .

hem numpy ve pandas için
import numpy as np 

wind_direction_column = 47 
data = np.loadtxt('weather_in.csv', delimiter=',') 
min_indices = (data[wind_direction_column] >= 10) 
max_indices = (data[wind_direction_column] <= 100) 
data = data[min_indices & max_indices] 
np.savetxt('weather_out.csv', data, delimiter=',') 

büyüktür/az-daha hatları aslında tek bir kombine ve (son) çıkış hattına yerleştirilen seçim, satır, ama anlamak daha kolay olduğunu düşünüyorum olabilir Her birini kendi satırlarına koyduğunuzda.

+0

Teşekkürler Mike, yardım çok takdir edilmektedir. Bunu bugün uygulamaya çalışacağım. –

+0

Hızlı bir soru, pd.read_csv komutu sadece .csv dosyaları için çalışıyor mu? ya da .txt dosyaları için de kullanılabilir mi? –

+0

[Dokümantasyon] 'da (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) virgül üstlendiğini görebilirsiniz, ancak birçok seçenek vardır. Özellikle, 'sep' argümanı ile hangi ayırıcının kullanılacağını anlatabilirsiniz. Ve eğer 'sep = None' iletirseniz, bunu otomatik olarak çözmeyi deneyecektir. – Mike

İlgili konular