2013-05-05 30 views
-1

我遇到的問題是,當我寫入文件時,文件輸出與std.out不同,因爲我將兩次調用句子() 。一次用於打印並再次用於寫入。我怎樣才能輸出相同的?嘗試輸出到文件以及打印到屏幕內循環

我正在考慮先寫入文件,然後打開它來閱讀,但似乎很笨拙。

任何想法?

nouns = ["random_noun1","random_noun2","random_noun3"] 
adverbs = ["random_adverb1","random_adverb2","random_adverb3"] 
verbs = ["random_verb1","random_verb2","random_verb3"] 

def random_n(): 
    random_noun = random.choice(nouns) 
    return random_noun 

def random_av(): 
    random_adverb = random.choice(adverbs) 
    return random_adverb 

def random_v(): 
    random_verb = random.choice(verbs) 
    return random_verb 

def sentence(): 
    s = str(random_n().capitalize()) + " " + str(random_av()) + " " + str(random_v()) + " " + str(random_n() + ".") 
    return s 

def WriteFile(filename,text): 
    myfile = open(filename, 'a') 
    print(text,file=myfile) 
    myfile.close() 


def generate(): 
    for generate in range(number_of_sentences()): 
     print(generate +1, sentence()) 

感謝

回答

1

可以簡化這個代碼很多;

import random 

nouns = ["random_noun1","random_noun2","random_noun3"] 
adverbs = ["random_adverb1","random_adverb2","random_adverb3"] 
verbs = ["random_verb1","random_verb2","random_verb3"] 

你的功能random_n()random_av()random_v()是一樣的,除了他們使用的單詞不同的列表。所以根據DRY原則(不要重複自己),把它作爲一個函數,它需要一個參數。沒有必要存儲隨機選擇,因爲你唯一要做的就是返回它。所以這個功能變成了一個單線程。

def rnd(l): 
    return random.choice(l) 

使用str.join加入字符串。 :-)不需要將rnd()的輸出轉換爲字符串,因爲它已經是一個字符串。

def sentence(): 
    return ' '.join([rnd(nouns).capitalize(), rnd(adverbs), rnd(verbs)+'.']) 

使用單個函數打印到標準輸出並寫入文件。該代碼還提供了一個示例如何使用文檔字符串。

def generate(n, filename): 
    """Write a number of random sentences to a file and standard output. 

    Arguments: 
    n -- the number of random sentences to write. 
    filename -- the name of the file to write the sentences to. 
    """ 
    with open(filename, 'w+') as outf: 
     for generate in range(n): 
      s = sentence() 
      print(generate + 1, s) 
      outf.write(s + '\n') 
+0

謝謝,效果很好。我會考慮改變其他部分。它很笨重,但它工作。這好多了。 – Vendril 2013-05-05 11:18:18

0
def generate(): 
    with open(filename, 'a') as fh: 
     for generate in range(number_of_sentences()): 
      print(generate +1, sentence()) 
      fh.write(sentence()) 

不知道的變量,但你的想法。
也不是很確定print(generate +1, sentence())是如何工作的,但是自從您編寫代碼後,您可能會有更好的想法。

python中的with語句打開文件,將它放在一個佔位符中(在這種情況下爲fh),當您離開該塊時,它會自動關閉句柄。

在循環中打開工作關閉文件也是一個壞主意,它會給硬盤驅動器(和操作系統)帶來不必要的壓力。

+0

對不起,我更新了我的主要代碼。謝謝。 – Vendril 2013-05-05 10:38:31

1

剛剛返回的值存儲在一個變量,並用它來打印和寫入文件:

def generate(): 
    with open(filename, 'a') as output_file: 
     for generate in range(number_of_sentences()): 
      next_sentence = sentence() 
      print(generate +1, next_sentence) 
      output_file.write(next_sentence) 
+0

對不起,我更新了我的主要代碼。謝謝。 – Vendril 2013-05-05 10:38:49