2017-11-15 4 views
-2

Also muss ich ein Programm schreiben, das eine Textdatei liest, und kopiert seinen Inhalt in eine andere Datei. Ich muss dann eine Spalte am Ende der Textdatei hinzufügen und diese Spalte mit einem int füllen, der mit der Funktion calc_bill berechnet wird. Ich kann es bekommen, um den Inhalt der ursprünglichen Datei auf den neuen zu kopieren, aber ich kann nicht scheinen, dass mein Programm in den Ints gelesen wird, die für das Ausführen von calc_bill notwendig sind. Jede Hilfe würde sehr geschätzt werden.Python-Datei lesen und schreiben

Hier sind die ersten 3 Zeilen der Textdatei aus Ich lese:

CustomerID Title FirstName MiddleName LastName Customer Type 
1 Mr. Orlando N. Gee Residential  297780 302555 
2 Mr. Keith NULL Harris Residential  274964 278126 

Es kopiert die Datei genau so, wie es in die neue Datei soll. Was nicht funktioniert, ist das Schreiben von bill_amount (calc_bill)/billVal (main) in die neue Datei in einer neuen Spalte. Hier ist die erwartete Ausgabe in die neue Datei:

CustomerID Title FirstName MiddleName LastName Customer Type Company Name Start Reading End Reading BillVal 
1 Mr. Orlando N. Gee Residential  297780 302555  some number 
2 Mr. Keith NULL Harris Residential  274964 278126 some number 

Und hier ist mein Code:

def main(): 
    file_in = open("water_supplies.txt", "r") 
    file_in.readline() 
    file_out = input("Please enter a file name for the output:") 
    output_file = open(file_out, 'w') 
    lines = file_in.readlines() 
    for line in lines: 
     lines = [line.split('\t')] 
     #output_file.write(str(lines)+ "\n") 
     billVal = 0 
     c_type = line[5] 
     start = int(line[7]) 
     end = int(line[8]) 
     billVal = calc_bill(c_type, start, end) 
     output_file.write(str(lines)+ "\t" + str(billVal) + "\n") 


def calc_bill(customer_type, start_reading, end_reading): 
    price_per_gallon = 0 

    if customer_type == "Residential": 
     price_per_gallon = .012 

    elif customer_type == "Commercial": 
     price_per_gallon = .011 

    elif customer_type == "Industrial": 
     price_per_gallon = .01 

    if start_reading >= end_reading: 
     print("Error: please try again") 

    else: 
     reading = end_reading - start_reading 

    bill_amount = reading * price_per_gallon 
    return bill_amount 
main() 
+0

Was ist der Stromausgang? – Shadow

+0

Es gibt keinen Fehler beim Kompilieren. Die aktuelle Ausgabe der neu generierten Textdatei befindet sich im zweiten Block von "code" in der ursprünglichen Frage. –

+0

Sie haben geschrieben, dass dies die erwartete Ausgabe ist. Vielleicht möchten Sie das beheben :) – Shadow

Antwort

0

Es sind die oben genannten Themen, aber hier ist eine kleine Änderung Ihrer main() Methode, die richtig funktioniert.

def main(): 
    file_in = open("water_supplies.txt", "r") 
    # skip the headers in the input file, and save for output 
    headers = file_in.readline() 
    # changed to raw_input to not require quotes 
    file_out = raw_input("Please enter a file name for the output: ") 
    output_file = open(file_out, 'w') 
    # write the headers back into output file 
    output_file.write(headers) 
    lines = file_in.readlines() 
    for line in lines: 
     # renamed variable here to split 
     split = line.split('\t') 
     bill_val = 0 
     c_type = split[5] 
     start = int(split[6]) 
     end = int(split[7]) 
     bill_val = calc_bill(c_type, start, end) 
     # line is already a string, don't need to cast it 
     # added rstrip() to remove trailing newline 
     output_file.write(line.rstrip() + "\t" + str(bill_val) + "\n") 

Beachten Sie, dass die line Variable in der Schleife die Newline enthält, so dass Sie, dass ab und strippen müssen, wenn du gehst, es in die Ausgabedatei zu schreiben, wie sie ist. Ihre start und end Indizes waren auch um 1, also änderte ich zu split[6] und split[7].

Es ist eine gute Idee, nicht zu verlangen, dass der Benutzer die Anführungszeichen für den Dateinamen enthält, also behalten Sie das auch im Auge. Ein einfacher Weg ist, einfach raw_input anstelle von input zu verwenden.

Beispieleingabedatei (von OP):

CustomerID  Title FirstName  MiddleName  LastName  Customer Type 
1  Mr.  Orlando N.  Gee  Residential  297780 302555 
2  Mr.  Keith NULL Harris Residential  274964 278126 

$ python test.py 
Please enter a file name for the output:test.out 

Ausgang (test.out):

1  Mr.  Orlando N.  Gee  Residential  297780 302555 57.3 
2  Mr.  Keith NULL Harris Residential  274964 278126 37.944 
+0

Vielen Dank für Ihre Hilfe, aber ich habe immer noch die gleiche Ausgabe für die neu erzeugte Datei. –

+0

Siehe meine Änderungen. Ich habe die Eingabedatei, die ich verwende, aus Ihrer ursprünglichen Frage hinzugefügt, sowie die Ausgabe, die generiert wird, wenn ich den obigen Code ausführe. –

+0

Vielen Dank, das funktioniert. Meine einzige Frage ist, was meinst du mit der Funktion input(), die die Benutzer zwingt, Anführungszeichen zu verwenden? –

0

Es gibt ein paar Dinge. Der inkonsistente Abstand in Ihren Spaltennamen macht das Zählen der tatsächlichen Spalten ein wenig verwirrend, aber ich glaube, dass dort 9 Spaltennamen vorhanden sind. Jede Ihrer Datenzeilen hat jedoch nur 8 Elemente. Es sieht also so aus, als hätten Sie einen zusätzlichen Spaltennamen (vielleicht "CompanyName"). Also loswerden oder die Daten reparieren.

Dann zeigen Ihre Variablen "start" und "end" auf Index 7 bzw. 8. Da es jedoch nur 8 Elemente in der Zeile gibt, denke ich, die Indizes sollten 6 und 7 sein.

Ein anderes Problem könnte sein, dass innerhalb Ihrer for-Schleife durch "Linien" Sie "Linien" zu den Elementen in diese Linie. Ich würde vorschlagen, die zweite "Zeilen" Variable innerhalb der for-Schleife zu etwas anderem, wie "Elemente" umzubenennen.

Abgesehen davon warne ich Sie nur hinsichtlich der Konsistenz der Namen. Einige Ihrer Spaltennamen sind camel-case und andere haben Leerzeichen. Einige Ihrer Variablen sind durch Unterstriche getrennt und andere sind camel-case.

Hoffentlich hilft das. Lassen Sie mich wissen, wenn Sie weitere Fragen haben.

0

Sie haben zwei Fehler in Ihrem Umgang mit Variablen, die beide in der gleichen Zeile:

lines = [line.split()] 
  • Sie setzen diese in Ihre lines Variable, die die gesamte Dateiinhalt ist. Sie haben gerade den Rest Ihrer Eingabedaten verloren.
  • Sie haben eine neue Liste von der Rückkehr von split gemacht.

diese Zeile Versuchen:

line = line.split() 

Ich habe vernünftige Ausgabe mit dieser Änderung, sobald ich ein paar Annahmen über Ihre Platzierung von Tabs machen.

Denken Sie auch an nicht überschreiben Sie eine Variable mit einer anderen Datensemantik; es verwirrt die Verwendung.Zum Beispiel:

for record in lines: 
    line = record.split()