2016-04-10 5 views
1

Die Idee hinter dem folgenden Code ist, dass wenn die Variable crop bereits in der TXT-Datei enthalten ist die Variable quantity am Ende der gleichen Zeile wie crop hinzugefügt wird. Dies ist mein Versuch, dies zu tun, aber es funktioniert nicht: Sie müssen es wirklich ausführen, um zu verstehen, aber im Wesentlichen wird der falsche Abschnitt der Liste hinzugefügt, eine ständig wachsende Reihe von '/' erscheint und die Zeile Pausen verschwinden. Kann jemand diesen Code ändern, damit er richtig funktioniert?Warum funktioniert dieses Schreiben in Python nicht?

Was soll ausgegeben werden:

Lettuce 77 88 100 
Tomato 99 

Was tatsächlich ausgegeben:

["['\\n', 'Lettuce 77 \\n88 ', 'Tomato 88 ']100 "] 

Code:

def appendA(): 

with open('alpha.txt', 'r') as file_1: 
    lines = file_1.readlines() 

    for line in lines: 
    if crop in line: 
     index = lines.index(line) 
     line = str(line + quantity + ' ') 
     lines [index] = line 
     newlines = str(lines) 

     #The idea here is that the variable quantity is added onto the end 
     # of the same row as the entered crop in the .txt file. 


     with open('alpha.txt', 'w') as file_3: 
      file_3.write (newlines) 

def appendB(): 

with open('alpha.txt', 'a') as file_2: 

    file_2.write ('\n') 
    file_2.write (crop + ' ') 
    file_2.write (quantity + ' ') 

crop = input("Which crop? ") 
quantity = input("How many? ") 

with open('alpha.txt', 'a') as file_0: 

if crop in open('alpha.txt').read(): 
    appendA() 
else: 
    appendB() 
+0

Können Sie ein „Beispiel rechts Ausgang“ posten und die stattdessen bekommen? – syntonym

+1

Sie müssen die Zeilenumbrüche von Ihrer Eingabe entfernen, während Sie sie einlesen. Dies ist auch nicht der beste Weg, um über eine Textdatei in Python zu iterieren. –

+0

Veröffentlichen Sie keine Screenshots von Text. Das ist dumm. – Tomalak

Antwort

0

Lassen Sie uns beginnen! Ihr Code sollte in etwa so aussehen:

def appendA(): 
    with open('alpha.txt', 'r') as file_1: 
     lines = [] 

     for line in file_1: 
      if crop in line: 
       line = str(line.rstrip("\n") + quantity + "\n") 
      lines.append(line) 

     #The idea here is that the variable quantity is added onto the end 
     # of the same row as the entered crop in the .txt file. 
     with open('alpha.txt', 'w') as file_3: 
      file_3.writelines(lines) 


def appendB(): 
    with open('alpha.txt', 'a') as file_2: 
     file_2.write('\n') 
     file_2.write(crop + ' ') 
     file_2.write(quantity + ' ') 

crop = "Whichcrop" 
quantity = "+!!!+" 

with open('alpha.txt') as file_0: 
    if crop in file_0.read(): 
     print("appendA") 
     appendA() 
    else: 
     print("appendB") 
     appendB() 


with open('alpha.txt', 'a') as file_0: 
    if crop in open('alpha.txt').read(): 
     appendA() 
    else: 
     appendB() 

Auch Sie machen mehrere Fehler. Diese Zeile "mit open ('alpha.txt', 'a') als file_0:" öffne Datei mit Kontext zum Anhängen am Ende der Datei, aber du verwendest keine Variable file_0. Ich denke, es ist extra. Im nächsten Schritt haben Sie die Datei zum Prüfen geöffnet "crop in open ('alpha.txt'). Read()", aber niemals schließen.

[ "[ '\ n', 'Kopfsalat 77 \ n88',‚Tomato 88 '] 100 „] Sie erhalten einen solchen Ausgang, weil, verwenden Sie schreiben statt writelines: mit open (' alpha.txt ',' w ') als file_3: file_3.write (Zeilenumbrüche)

Auch Sie schreiben in der Datei nach jeder Iteration, besser, um eine Liste von Zeichenfolgen zu bilden und dann in Datei schreiben.

0
newlines = str(lines) # you convert all lines list to str - so you get default conversion 

und auch Sie sollten ganze Datei ersetzen, wenn Sie wollen in der Mitte schreiben

Und Sie können auch von appendB gelesen werden, da Sie trotzdem noch jede Zeile und Ihren Code überprüfen, ist in Bezug auf die Leistung nicht optimal :)

from os import remove, close 

def appendA(filename, crop, quantity): 

    result = [] 
    exists = False 
    with open(filename, 'r') as file_1: 
     lines = file_1.readlines() 

    for line in lines: 
     if not crop in line: 
      result.append(line) 
     else: 
      exists = True 
      result.append(line.strip('\n') + quantity + '\n') 


    if not exists:   
     with open(filename, 'a') as file_2: 
      file_2.write ('\n' + crop + ' ' + quantity + ' ') 
    else: 
     tmp_file = filename + '.tmp' 
     with open(tmp_file, 'w') as file_3: 
      file_3.write(result) 
      remove(filename) 
      move(tmp_file, filename) 
0
  1. "str (Linien)": Linien ist Listentyp, können Sie '' .join (Linien) zu wandeln es in einen String verwenden.
  2. "line in den Zeilen": "line" mit einer "\ n" end
  3. -Code Einrückung Fehler: "line newlines .join '' = (Linien)" und die Folge
  4. "crop wenn in den Zeilen" ist fehler, wenn zuschneiden genannt "AA" und "AABB", die neue eingabe "AA" mit return true, wird die menge an alle linien einschließlich "AA", nicht nur die "AA" linie.


    def appendA(): 
     with open('alpha.txt', 'r') as file_1: 
      lines = file_1.readlines() 

      for line in lines: 
       if crop in line: 
        index = lines.index(line) 
        line = str(line.replace("\n", "") + ' ' + quantity + '\n') 
        lines[index] = line 
      newlines = ''.join(lines) 

      # The idea here is that the variable quantity is added onto the end 
      # of the same row as the entered crop in the .txt file. 
      with open('alpha.txt', 'w') as file_3: 
       file_3.write(newlines) 


    def appendB(): 
     with open('alpha.txt', 'a') as file_2: 
      file_2.write("\n") 
      file_2.write(crop + ' ') 
      file_2.write(quantity + ' ') 


    crop = input("Which crop? ") 
    quantity = input("How many? ") 

    with open('alpha.txt', 'a') as file_0: 
     if crop in open('alpha.txt').read(): 
      appendA() 
     else: 
      appendB()