2016-04-14 19 views
2

Ich muss eine Python-Datei erstellen, die den Benutzer nach einem Dateipfad zu einem Textdokument fragt und ihn dann in Pig Latin konvertiert und eine Zeilen-/Wortzählung durchführt.Python Pig Lateinischer Konverter und Zeilen-/Wort-Zähler

• A function to generate the pig Latin version of a single word

• A function to print line and word counts to standard output

• Correct pig Latin output with identical formatting as the original text file

• Correct line and word counts

Ich kann nicht herausfinden, warum das Schwein lateinisch falsch herauskommt. Mein Lehrer sagte, dass ich noch eine string.strip("\n") brauche, weil es die Wörter falsch konvertiert, aber ich habe keine Ahnung, wo ich das hinstellen soll.

Auch mein Zeilenzähler ist kaputt. Es zählt aber sagt immer 222 Zeilen.

Wie kann ich nur die Zeilen mit Worten zählen?

#Step 1: User enters text file. 
#Step 2: Pig Latin function rewrites file and saves as .txt. 
#Step 3: Tracks how many lines and words it rewrites. 


vowels = ("A", "a", "E", "e", "I", "i", "O", "o", "U", "u") 

# Functions 

def pig_word(string): 
    line = string.strip("\n") 
    for word in string.split(" "): 
     first_letter = word[0] 
     if first_letter in vowels: 
      return word + "way"  
     else: 
      return word[1:] + first_letter + "ay"  

def pig_sentence(sentence): 
    word_list = sentence.split(" ") 
    convert = " " 
    for word in word_list: 
     convert = convert + pig_word(word)  
     convert = convert + " " 
    return convert 

def line_counter(s): 
    line_count = 0 
    for line in s: 
     line_count += 1 
    return line_count 

def word_counter(line): 
    word_count = 0 
    list_of_words = line.split() 
    word_count += len(list_of_words) 
    return word_count 




# File path conversion 

text = raw_input("Enter the path of a text file: ") 
file_path = open(text, "r") 
out_file = open("pig_output.txt", "w") 


s = file_path.read() 
pig = pig_sentence(s) 
out_file.write(pig+" ") 
out_file.write("\n") 


linecount = line_counter(s) 
wordcount = word_counter(s) 


file_path.close() 
out_file.close() 

# Results 

print "\n\n\n\nTranslation finished and written to pig_output.txt" 
print "A total of {} lines were translated successfully.".format(linecount) 
print "A total of {} words were translated successfully.".format(wordcount) 
print "\n\n\n\n" 

Antwort

0

Ihr erstes Problem ist hier:

def pig_word(string): 
    line = string.strip("\n") #!!!! line is NEVER USED !!! 
    for word in string.split(" "): #you want *line*.split here 

die zweite Ausgabe von Iterieren über eine Zeichenfolge verursacht wird, es durch jedes Zeichen geht, anstatt jede Zeile wie eine Datei nicht:

>>> for i in "abcd": 
...  print(i)  

a 
b 
c 
d 

so in Ihrem line_counter anstatt zu tun:

for line in s: 
    line_count += 1 

Sie müssen nur tun:

for line in s.split("\n"): 
    line_count += 1 
0
  1. Der erste Grund, warum Ihr nicht immer die Ausgabe, die Sie wollen, ist, weil in Ihrer pig_word(string) Funktion geben Sie das erste Wort in der Zeichenfolge zurück, wenn Sie setzen, dass return innerhalb Ihrer for Schleife. Außerdem hat Ihr Lehrer darüber gesprochen, alle Zeilen in die Funktion aufzunehmen und über jede Zeile über str.split('\n') zu iterieren. \n steht für das Zeichen "new-line".

Sie können etwas wie das versuchen, das zu korrigieren.

def pig_sentence(string): 
    lines = [] 
    for line in string.split('\n'): 
     new_string = "" 
     for word in line.split(" "): 
      first_letter = word[0] 
      if first_letter in vowels: 
       new_string += word + "way" 
      else: 
       new_string += word[1:] + first_letter + "ay" 
      lines.append(new_string) 
    return lines 

der Durchführung der Änderungen

  • Initialized eine neue Liste lines, die wir in den Schleifen anhängen können.

  • Iterieren über jede Zeile in der übergebenen Zeichenfolge.

  • Erstellen Sie für jede Zeile eine neue Zeichenfolge new_string.

  • Verwenden Sie den Code, sondern statt return ing wir fügen Sie new_string, dann new_string zu unserer Liste der neuen Zeilen anhängen, lines.

  • Beachten Sie, dass dadurch zwei Funktionen entfallen. Beachten Sie auch, dass ich pig_word in pig_sentence umbenannt habe.


  1. Die zweiten Fehler in der Funktion ist line_counter(s). Sie durchlaufen jedes Zeichen und nicht jede Zeile. Fügen Sie hier wieder str.split('\n') hinzu, um die gewünschte Ausgabe zu erhalten, indem Sie die Zeichenfolge in eine Liste von Zeilen aufteilen und dann über die Liste iterieren. Hier

ist die modifizierte Funktion: (. Da gibt es nichts fehlerhafte mit Dateien io ist, ich werde einfach wörtliche eine Zeichenfolge verwenden hier für die Prüfung)

def line_counter(s): 
    line_count = 0 
    for _ in s.split('\n'): 
     line_count += 1 
    return line_count 


-Test

paragraph = """\ 
Hello world 
how are you 
pig latin\ 
""" 

lines = line_counter(paragraph) 
words = sum([word_counter(line) for line in paragraph.split('\n')]) 
out = pig_sentence(paragraph) 

print(lines, words, out) 

Die Ausgabe ist, was wir erwarten!

3 7 ['elloHay', 'elloHayorldway', 'owhay', 'owhayareway', 'owhayarewayouyay', 'igpay', 'igpayatinlay'] 
+0

Vielen Dank !! Die Zähler funktionieren jetzt, aber als ich den pig_sentence-Teil hinzugefügt habe, um meine beiden Funktionen zu ändern, erhalte ich einen TypeError: "str" ​​- und "list" -Objekte können nicht verkettet werden. Wie behebe ich diesen Fehler? – Roxy

+0

Welche Funktionen haben Sie zur Zeit? – Signal

0

Du nur den Raum zu entfernen, müssen Sie alle Interpunktion sowie Zeilenende Zeichen entfernen. Ersetzen

split(" ") 

mit

split() 

Ihr Satz Liste ist das Äquivalent von

sentence = 'Hello there.\nMy name is Roxy.\nHow are you? 

Wenn Sie nach split(" ") drucken und split() Sie werden den Unterschied sehen, und Sie werden die Ergebnisse, die Sie erwarten von.

Darüber hinaus erhalten Sie falsche Ergebnisse, weil Sie there übersetzt in heretay haben werden. Sie müssen Schleife um, so dass es als erethay

herauskommt

Das ist jeder Konsonant bis zum Ende vor dem Hinzufügen 'ay', so dass das neue Wort beginnt mit einem Vokal.