2013-04-19 4 views
2

Каждая цифра должна быть заменена на свое имя (ноль, один, два, три, четыре, пять, шесть, семь, восемь, девять), но я продолжаю получать это как в своем новом файле:Python - строки

zero0000000001one111111112222222222333three3333334444four4444455555five5555666666six666 

вот моя программа:

def numbers(fileName): 
    #open the inputed file ,prompt for the file 
    inFile= open(fileName,'r') #this will open the function for writing and reading 
    outFile=open('converted.txt', 'w') 
    for line in inFile: 
     wordList=line.split() 
     for word in wordList: 
      if word == '0': 
       outFile.write("zero") 
      else: 
       outFile.write(word) 

      if word =="1": 
       outFile.write("one") 
      #else: 
       #outFile.write(word) 

      if word in wordList == "2": 
       outFile.write("two") 
      #else: 
       #outFile.write(word) 

      if word == ("3"): 
       outFile.write("three") 
      #else: 
       #outFile.write(word) 

      if word == ("4"): 
       outFile.write("four") 
      #else: 
       #outFile.write(word) 

      if word == ("5"): 
       outFile.write("five") 
      #else: 
       #outFile.write(word) 

      if word == ("6"): 
       outFile.write("six") 
      #else: 
       #outFile.write(word) 

      if word == ("7"): 
       outFile.write(word) 
      #else: 
       #outFile.write(word) 

      if word == ("8"): 
       outFile,write(word) 
      #else: 
       #outFile.write(word) 

      if word == ("9"): 
       outFile.write(word) 
      #else: 
       #outFile.write(word) 
    outFile.write(" ") 
    outFile.write("\n") 
    outFile.close() 
    inFile.close() 
+0

как 'слово' инициализируется? –

ответ

2

Вот ваша проблема

for word in wordList: 
     if word == '0': 
      outFile.write("zero") 
     else: 
      outFile.write(word) 

Для каждого слова, которое не '0' лет u выводит, что слово находится в «else». Так, например, каждый 1 будет распечатывать 1 из-за отсутствия 0, даже если он позже распечатает one.

Я называю эту проблему проблемой «раннего по умолчанию», когда вы выполняете действие по умолчанию при первой ошибке проверки. Чтобы не страдать от проблемы «раннего дефолта», задержка делает действие по умолчанию как можно дольше. В этом случае вам нужна большая if ... else, если цепочка каждого возможного результата для слова, которое является специальным (от «0» до «9»), а затем конечная часть else, если цепочка будет действие по умолчанию для записи слова.

Что-то вроде

 if word == "0": 
      outFile.write("zero") 
     elif word == "1": 
      outFile.write("one") 
     elif word == "2": 
      outFile.write("two") 
... 
     else: 
      outFile.write(word) 

Более вещий формулировка, однако было бы использовать список:

numberWords = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] 

затем сделать это в течение цикла:

try: 
    outFile.write(numberWords[int(word)]) # attempt to convert word to an int, then look in the list for its word 
except ValueError: # if word was not a string version of an int 
    outFile.write(word) 

Это спасает вас от написания huuuuuuuge if/elif/else chain и легче поддерживать (например, вы можете делать операцию на всех numberWords сразу, например. сделать их в верхнем регистре или загрузить их из файла или ...)

0

Ваши блоки if/else довольно перепутаны. Вы должны избавиться от всех else заявлений, а также использовать elif после первого if, как это:

for word in wordList: 
     if word == '0': 
      outFile.write("zero") 
     elif word =="1": 
      outFile.write("one") 
     elif word == "2": # note that what you had here was very bad: if word in wordList == "2": 
      outFile.write("two") 
     elif word == "3": 
      outFile.write("three") 
     elif word == "4": 
      outFile.write("four") 
     elif word == "5": 
      outFile.write("five") 
     elif word == "6": 
      outFile.write("six") 
     elif word == "7": 
      outFile.write("seven") 
     elif word == "8": 
      outFile,write("eight") 
     elif word == "9": 
      outFile.write("nine") 
     else: 
      # If you want to leave any other character unchanged, then you say: 
      outFile.write(word) 
0

Изменение личности, если/иначе в один, если/Элиф/другой Постулаты

if word == '1': 
    outFile.write("one") 
elif word == '2': 
     outFile.write("two") 
elif word == '3': 
     outFile.write("three") 
else: 
     outFile.write("four") 
1

, если вы хотите, чтобы имя, которое будет прописано для всех цифр, то почему вы использовали

if word == "7": 
    outFile.write(word) 

для 7,8,9? Я думаю, что ошибка

3
digit_names = {'1': 'one', 
       '2': 'two', 
       ... 
       '9': 'ten'} 

mystring = open('in.txt', 'r').read() 
for d, n in digit_names.iteritems(): 
    mystring = mystring.replace(d, n) 

open('converted.txt', 'w').write(mystring) 

Это все, что вам нужно. Для python3 используйте digit_names.items(), а не digit_names.iteritems().

-1
  1. первым построить Dict для хранения цифр отображение на его имя

    digit_name = { 
         '1': 'one', 
         '2': 'two', 
         '3': 'three', 
         ... 
         } 
    
  2. затем отформатировать его при записи в файл

    for word in wordList: 
        outFile.write(digit_name.get(word, word)) 
    

или выходной магазин в списке, пишите в файл один раз.

new_word_list = [digit_name.get(word, word) for word in wordlist] 
0

Я хотел бы начать со словарем для отображения цифр на их имена, а затем определить функцию взять строковое представление числа и возвращает строку расширенную с этим отображением.

Чтобы сделать его немного более гибким, у меня будет флаг (толерантный), чтобы либо отфильтровать любые нецифровые символы из вывода, либо сохранить их, а другой, чтобы позволить вызывающему пользователю предоставить свой собственный разделитель.

#!/usr/bin/python 

    digit_names = { 
     '0': 'zero', 
     '1': 'one', 
     '2': 'two', 
     '3': 'three', 
     '4': 'four', 
     '5': 'five', 
     '6': 'six', 
     '7': 'seven', 
     '8': 'eight', 
     '9': 'nine' 
     } 

    def digit2name(num, tolerant=True, separator=''): 
     '''Replace a number (string of digits) with an expansion into the 
      mapping of each digit to its name. 
     ''' 
     return separator.join([digit_names.get(x,(x,'')[tolerant]) for x in num]) 

     ''' 
     results = list() 
     num = str(num) 
     for digit in num: 
      if tolerant: 
       default=digit 
      else: 
       default='' 
      results.append(digit_names.get(digit,digit)) 
     return separator.join(results) 
     ''' 

    if __name__ == '__main__': 
     import sys 
     for each in sys.argv[1:]: 
      print digit2name(each), 
      print digit2name(each, False, '.') 
      print 

Я сделал это как однострочник используя список понимание, а также как более читаемый и явный цикл (который я предпочитаю).

0

Нет необходимости использовать словарь, поскольку список имен можно получить по междунар (слово)

def numbers(fileName): 
    #open the inputed file ,prompt for the file 
    inFile= open(fileName,'r') #this will open the function for writing and reading 
    outFile=open('converted.txt', 'w') 
    for line in inFile: 
     wordList=line.split() 
     names = ['zero', 'one', 'two', 'three', 'four', 
       'five', 'six', 'seven', 'eight', 'nine'] 
     [outFile.write(names[int(word)]) for word in wordList] 
    outFile.write(" ") 
    outFile.write("\n") 
    outFile.close() 
    inFile.close()