2013-04-19 66 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

如何'word'初始化? –

回答

2

这是你的问题

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

对于每一个不是 '0' 字哟你输出'else'部分中的单词。因此,例如,由于不是0,因此即使后面打印出one,每个1也会打印出1

我把这个问题称为'早期默认'问题,你在第一次检查失败时执行默认操作。为了不受“早期违约”问题的影响,尽可能延迟默认行为。在这种情况下,你需要一个大的if ... else if每个可能的结果的链,这是特殊的(==“0”到==“9”),然后是else if的最后一个else写字的默认动作。

喜欢的东西

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

更Python的提法不过是使用的列表:

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

然后为此在for循环:

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) 

这样可以节省你从/写一个huuuuuuge if/elif/else链并且更容易维护(例如,你可以对所有操作数字一次,例如使它们成为大写,或从文件中加载它们,或...)

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/else语句一个IF/ELIF /其他statment

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. 首先建立一个字典来存储数字映射到它的名字

    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

无需使用字典,因为名称列表可以通过INT(字)访问

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()