2010-04-21 14 views
5

metin dosyasında bulmak ve değiştirmek numaralar <1 ...piton: Python programlama için oldukça yeni ve ben sahip bir soruna biraz yardım takdir ediyorum

Temelde ben hız değerleri içeren birden fazla metin dosyaları var örneğin:

0.259515E + 03 0.235095E + 03 0.208262E + 03 0.230223E + 03 0.267333E + 03 0.217889E + 03 0.156233E + 03 0.144876E + 03 0.136187E + 03 0.137865E + 00

Birçok satır için vb ...

Yapmam gereken şey, metin dosyasındaki tüm değerleri dönüştürmektir. 1'den az (ör. 0.137865E + 00 yukarıda) 0.100000E + 01 keyfi bir değere. Belirli değerleri 'replace()' yöntemiyle ve bir while döngüsüyle değiştirmek oldukça basit görünmekle birlikte, bir aralığı değiştirmek isterseniz bunu nasıl yapıyorsunuz?

sayesinde

cevap

7

olacağını umut bazı örnekleri görmek yararlıdır; ve bu problemi kendi başınıza denediğinizi varsayalım! dizeleri üzerinde

contents='0.259515E+03 0.235095E+03 0.208262E+03 0.230223E+03 0.267333E+03 0.217889E+03 0.156233E+03 0.144876E+03 0.136187E+03 0.137865E+00' 

split method çalışır: Burada

bu yaklaşım nasıl bir bozulmasıdır. Dizelerin bir listesini döndürür. Varsayılan olarak, boşluk böler:

string_numbers=contents.split() 
print(string_numbers) 
# ['0.259515E+03', '0.235095E+03', '0.208262E+03', '0.230223E+03', '0.267333E+03', '0.217889E+03', '0.156233E+03', '0.144876E+03', '0.136187E+03', '0.137865E+00'] 

map command ikinci değişken (liste string_numbers) elemanlarının her birine ilk argüman (fonksiyon float) uygular. float işlevi, her dizeyi kayan nokta nesnesine dönüştürür.

float_numbers=map(float,string_numbers) 
print(float_numbers) 
# [259.51499999999999, 235.095, 208.262, 230.22300000000001, 267.33300000000003, 217.88900000000001, 156.233, 144.876, 136.18700000000001, 0.13786499999999999] 

Sen 1 numaralı içine 1'den az sayıda dönüştürerek, listeyi işlemek için bir list comprehension kullanabilirsiniz conditional expression(1 if num<1 else num) num, 1'den az olduğunda 1 aksi takdirde num eşittir.

processed_numbers=[(1 if num<1 else num) for num in float_numbers] 
print(processed_numbers) 
# [259.51499999999999, 235.095, 208.262, 230.22300000000001, 267.33300000000003, 217.88900000000001, 156.233, 144.876, 136.18700000000001, 1] 

Bu aynı şeydir, tek satırda bütün:

comma_separated_string=', '.join(map(str,processed_numbers)) 
# '259.515, 235.095, 208.262, 230.223, 267.333, 217.889, 156.233, 144.876, 136.187, 1' 
+0

Bu harika. Şimdi koşullu ifadenin neden çalışmadığını merak ederek, bugün yaşlarım harcadım, daha sonra 2.4 – hjp

4

tipik bir teknik olacaktır: çizgiyle

  • okuma dosyası satırı
  • bölünmüş
  • dönüştürülen karşılaştırmak şamandıraya her dizeyi dönüştürmek dizeleri bir liste halinde her satırı Gerektiğinde değiştirin
  • yeni bir dosya

Ben henüz herhangi bir kod sahip görmüyorum gibi geri yazma, ben bu iyi bir başlangıç ​​

+0

sayesinde onlar yüzen dönüştürülmesi gerekir farkında, ama bölme hatları hakkında bilmiyordum. – hjp

3
Eğer programlama başlarken bence
def float_filter(input): 
    for number in input.split(): 
     if float(number) < 1.0: 
      yield "0.100000E+01" 
     else: 
      yield number 

input = "0.259515E+03 0.235095E+03 0.208262E+03 0.230223E+03 0.267333E+03 0.217889E+03 0.156233E+03 0.144876E+03 0.136187E+03 0.137865E+00" 
print " ".join(float_filter(input)) 
0

You:

processed_numbers=[(1 if num<1 else num) for num in map(float,contents.split())] 

processed_numbers unsurlarının dışında bir dize oluşturmak için, str.join method kullanabilirsiniz Dizgiyi ayrıştırmak için normal ifadeler kullanabilir. Burada, mantisin asla 1'den büyük olmadığını varsayıyorum (yani 0 ile başlıyor). Bu, sayının 1'den küçük olması için üsün 0 veya negatif olması gerektiği anlamına gelir. Aşağıdaki normal ifade '0', '.' Ile sınırsız sayıda ondalık basamak (en az 1), 'E' ve '+00' veya '-' ve iki ondalık basamak ile eşleşir.

result = re.sub(r"0\.\d*E(-\d\d|\+00)", "0.100000E+01", text) 

Düzenleme::

0\.\d+E(-\d\d|\+00) 

aşağıdaki piton koduyla Regexp'i kullanabilirsiniz, dosya değişkeni 'metin' haline okudum varsayarsak Sadece açıklama sınırlamaz fark geçerli sayı giriş sayıları pozitif sayılara. Negatif sayılar aşağıdaki regexp ile uyumlu olabilir:

-0\.\d+E[-+]\d\d 

Bu (pattern1 | pattern2) kullanılarak ilkinden sıralı olarak kullanılabilir Aşağıdaki Python kodu ile sonuçlanan sözdizimi: Ayrıca

result = re.sub(r"(0\.\d+E(-\d\d|\+00)|-0\.\d+E[-+]\d\d)", "0.100000E+00", subject) 

eğer üssün 99'u geçmesi ihtimali var, regexp '\ ​​d \ d' desenlerinden sonra '+' işareti ekleyerek daha da değiştirilebilir. Bu, iki VEYA DAHA FAZLA basamakta biten eşleşen hanelere izin verir.

0

Komut dosyası şu anda istediğim gibi çalışıyorum ... teşekkürler millet. Listeyi yeni bir dosyaya yazarken parantezlerden ve virgüllerden kurtulmak için değiştirme yöntemini kullandım - daha basit bir yol var mı?

ftext = open("C:\\Users\\hhp06\\Desktop\\out.grd", "r") 
otext = open("C:\\Users\\hhp06\\Desktop\\out2.grd", "w+") 

for line in ftext: 
    stringnum = line.split() 
    floatnum = map(float, stringnum) 
    procnum = [(1.0 if num<1 else num) for num in floatnum] 
    stringproc = str(procnum) 
    s = (stringproc).replace(",", " ").replace("[", " ").replace("]", "") 
    otext.writelines(s + "\n") 
otext.close() 
+0

Hi hjp'den yükseltmem gerektiğini fark ettim. Bir kişiye doğrudan sormak veya yeni bir soru göndermek için yorum eklemek daha iyidir. Bu şekilde daha fazla insan bunu fark edecektir. Ancak, sorunuzu cevaplamak için kesinlikle bu görev için 'replace' kullanmayı istemezsiniz. 'S =', '.join (map (str, procnum))' ı deneyin. Http://docs.python.org/library/stdtypes.html#str.join sayfasına bakın. – unutbu

3
import numpy as np 

a = np.genfromtxt('file.txt') # read file 
a[a<1] = 0.1     # replace 
np.savetxt('converted.txt', a) # save to file 
İlgili konular