2016-05-03 6 views
0

Es hat funktioniert, wenn Ich testete es in einem separaten Skript obwohl ...

Anfänger hier in der Hilfe brauchen. Ich habe ein Problem mit meinem Python-Skript, das ich selbst nicht lösen konnte. Das Skript soll Fließkommazahlen aus einer Textdatei lesen und einige Berechnungen durchführen. Ich kann die Nummern nicht in die Liste R[] bekommen.

Unten ist ein Beispiel der Textdatei, wo die erste Zeile (s[0]) der Nennwert ist, Zeile zwei (s[1]) ist die Toleranz und die folgenden Zeilen sind einige Widerstände.


3300,0

10,0

3132,0

3348,5

3557,3

3467,4

3212,0

3084,6

3324,0

Ich habe den folgenden Code:

R = [] 
Ntoolow = Nlow = Nhigh = Ntoohigh = 0.0 
lines = 0 

def find_mean(q): 
    tot = 0.0 
    c = len(q) 
    for x in range (c): 
     tot += q[x] 
     return tot/c 


def find_median(q): 
    c = len(q) 
    if c%2: 
     return float(q[int(c/2)]) 
    else: 
     c /= 2 
     return (q[int(c)]+q[int(c-1)])/2.0 


file_name = input("Please enter the file name: ") 
file = open(file_name, "r") 

s = file.readlines() 

Rnom = float(s[0]) 
Tol = float(s[1]) 


keepgoing = True 

while keepgoing: 
    s = file.readline() 
    if s == "": 
     keepgoing = False 
    else: 
     R.append(float(s)) 


lines = len(file.readlines()) 
N = lines - 2 
R.sort() 


Rmin = R[0] 
Rmax = R[N-1] 

Rlowerlimit = Rnom - Tol 
Rupperlimit = Rnom + Tol 


for rn in R: 
    if rn < Rlowerlimit: 
     Ntoolow += 1 
    elif rn < Rnom: 
     Nlow += 1 
    elif rn <= Rupperlimit: 
     Nhigh += 1 
    else: 
     Ntoohigh += 1 


Ptoolow = 100.0 * Ntoolow/N 
Plow = 100.0 * Nlow/N 
Phigh = 100.0 * Nhigh/N 
Ptoohigh = 100.0 * Ntoohigh/N 


Rmean = find_mean(R) 
Rmedian = find_median(R) 


print("Total number of parts tested: " + str(N)) 
print("The largest resistor is: " + str(Rmax) + " and the smallest is: " + str(Rmin)) 
print("The mean is: " + str(Rmean) + " and the median is: " + str(Rmedian)) 
print("The percentage of resistors that have too low tolerance is: " + str(Ptoolow) + "%") 
print("The percentage of resistors that have low tolerance is: " + str(Plow) + "%") 
print("The percentage of resistors that have high tolerance is: " + str(Phigh) + "%") 
print("The percentage of resistors that have too high tolerance is: " + str(Ptoohigh) + "%") 

file.close() 
+0

kippe Ihre Frage bekommen ... do u wollen add return Ziffer in die Liste R []? –

+0

Was scheint das Problem zu sein? Erhalten Sie einen Fehler - wenn ja, welcher? – usr2564301

Antwort

0

Ersetzen Sie den Code,

while keepgoing: 
    s = file.readline() 
    if s == "": 
     keepgoing = False 
    else: 
     R.append(float(s)) 

mit,

for i in s: 
    R.append(float(i)) 

Sein Gebens mir die Antwort ...Hier

ist die Ausgabe, nachdem ich Ihren Code Edited,

Total number of parts tested: -2 
The largest resistor is: 3348.5 and the smallest is: 10.0 
The mean is: 1.11111111111 and the median is: 3300.0 
The percentage of resistors that have too low tolerance is: -200.0% 
The percentage of resistors that have low tolerance is: -0.0% 
The percentage of resistors that have high tolerance is: -50.0% 
The percentage of resistors that have too high tolerance is: -200.0% 
+0

Wie kann ich verhindern, dass die ersten beiden Nummern (3300.0 und 10.0) in die Liste aufgenommen werden? – 557365726e616d65

+0

Sie möchten nicht die ersten zwei Zahlen hinzufügen? (3300.0 und 10.0)? –

+0

Wenn Sie es vom Hinzufügen der ersten zwei Ziffern (3300.0 und 10.0) fernhalten möchten, bedeutet das, dass Sie Ihre Textdatei vom 2. Element wie folgt starten sollten, für i in s [2:]: –

0

Es gibt keine Notwendigkeit, das Rad neu zu erfinden, weiß, Python, wenn es das Ende einer Datei erreicht ist, nicht wahr müssen Sie Ihre eigene Klausel hinzufügen (plus, wird nicht nach "" möglicherweise auf leeren Zeilen enden? Nicht so sicher.

Versuchen Sie diesen Code:

with open(file_name) as f: 
    try: 
     R = float(f.readlines()) 
    except TypeError: 
     pass 
+0

'Typeerror: float() Argument ist ein String oder ein number' sein – SparkAndShine

+0

^fangen diese wie folgt ' mit offenem (datei_name) als f: try: R = float (f.readlines()) außer Typeerror : pass' –

+0

Danke Jungs, änderte es – dahui

1

Python eine Reihe von Bibliotheken hat, die Informationen aus CSV-Dateien, wie csv, numpy und Pandas lesen kann. Versuchen Sie Folgendes:

import csv 
with open('filename.csv','r') as f: 
    reader = csv.reader(f) 

Sie können dann diese Zeilen wie iterieren:

for row in reader: 
    print(row) 
1

die leeren Zeilen überspringen und entfernen Zeilenumbrüche \n mit rstrip():

filename = 'test.dat' 

with open(filename, 'r') as f: 
    s = [float(line.rstrip()) for line in f if line.rstrip()] 

print(s) 
#[3300.0, 10.0, 3132.0, 3348.5, 3557.3, 3467.4, 3212.0, 3084.6, 3324.0]