2016-10-13 68 views
-1

我寫了下面的代碼來寫入文件,將其轉換爲整數值,保存該文件,然後讀取並將其轉換回原始字符串。但是,它會輸出兩次。讀取文件時打印輸出兩次

我的代碼是

def write(): 
    sentence=input('What is your Statement?:') 
    name=input('Name your file:') 
    sentence=sentence.lower() 
    words=sentence.split(' ') 
    file_register=set() 
    F_output=[] 
    position=[] 

for i in words: 
    if i not in file_register: 
     F_output.append(i) 
     file_register.add(i) 

for x in words: 
    for y in range(len(F_output)): 
     if x==F_output[y]: 
      position.append(y) 
name+='.txt' 
with open(str(name),'w') as f: 
    f.write(str(len(position)) + '\n') 
    for c in range(len(position)): 
     f.write(str(position[c]) + '\n') 
    f.write(str(len(F_output)) + '\n') 
    for d in range(len(F_output)): 
     f.write(str(F_output[d] + '\n')) 
    f.close 
    global name 
    global position 

def read1(): 
    savefile=[] 
    output=('') 
    with open(name,'r') as file_open: 
     num=int(file_open.readline()) 
     while num!=0: 
      a1=file_open.readline() 
      a1_split=a1.split('\n') 
      position.append(int(a1_split[0])) 
      num-=1 
     file_integer=int(file_open.readline()) 
     while file_integer!=0: 
      word_s=file_open.readline() 
      word_split=word_s.split() 
      savefile.append(word_split) 
      file_integer-=1 

    for n in range(len(position)): 
     a=position[n] 
     output+=str(savefile[a])+('') 
    global output 

write() 
read1() 
print('Your file is: '+output) 

我曾試圖尋找,但我無法找到它的答案。我相當新的Python和任何幫助表示讚賞。

+2

請修復您的代碼片段縮進。 –

+0

以這種方式使用全局變量幾乎總是一個壞主意 – brianpck

+2

@brianpck你可以放棄「這樣」的一部分 - 至於我所關心的,你也可以放棄「幾乎」;) –

回答

0

write()中,您聲明position爲全局。在read1()中,您不要將其聲明爲全局變量,但由於您從不創建本地變量,因此它是全局變量。所以,你最終填寫它兩次:一次在write()然後再次在read1()

長話短說:不要使用全局變量。你不需要它們。

此外,你會發現你的代碼方式更容易閱讀,理解和調試1 /使用更好的命名,2 /編寫簡單的,短的函數做一件事,對他們的輸入(參數)和返回值(相同的參數應該產生相同的輸出值),3 /正確使用python的for循環。

這裏是你的代碼可能看起來像下面的這些規則的一個例子:

def parse(sentence): 
    sentence=sentence.lower() 
    words=sentence.split(' ') 

    register=set() 
    output = [] 
    positions = [] 

    for word in words: 
     if word not in register: 
      output.append(word) 
      register.add(word) 

    for word in words: 
     for index in range(len(output)): 
      if word == output[index]: 
       positions.append(index) 

    return output, positions 

def write(path, output, positions): 
    with open(path, 'w') as f: 
     f.write(str(len(positions)) + '\n') 
     for index in positions: 
      f.write(str(index) + '\n') 
     f.write(str(len(output)) + '\n') 
     for word in output: 
      f.write(word + '\n') 


def read(path): 
    words = [] 
    positions = [] 

    with open(path, 'r') as f: 
     poscount = int(f.readline().strip()) 
     while poscount: 
      line = f.readline().strip() 
      pos = int(line) 
      positions.append(pos) 
      poscount -= 1 

     wordcount = int(f.readline().strip()) 
     while wordcount: 
      line = f.readline() 
      word = line.strip() 
      words.append(word) 
      wordcount -= 1 

    output = [] 
    for index in positions: 
     word = words[index] 
     output.append(word) 

    return output, positions 



def main(): 
    sentence = input('What is your Statement?:') 
    path = input('Name your file:') 
    if not path.endswith(".txt"): 
     path +=".txt" 

    source_out, source_positions = parse(sentence) 
    write(path, source_out, source_positions) 

    read_out, read_positions = read(path) 
    print("your file is: {}".format(read_out)) 

if __name__ == "__main__": 
    main() 

該代碼仍然過於複雜,恕我直言,但至少它主要是可讀的,不使用任何全球性的,應該更容易去測試。

+0

謝謝,我使用閒置,是相當新的,所以感謝您的幫助。 –

相關問題