2015-10-20 105 views
0

我的目標是在用戶輸入特定年份時將文本行打印到新文檔中。到目前爲止,該部分工作正常。但是,我不確定如何處理用戶輸入「all」來表示他們想要將所有數據複製到新文件中。您可以在試圖使審判的意識,除了如下面塊看到我失敗的嘗試:如何驗證python中的字符串和整數輸入?

filename = input("Enter an output file name: ") 
file_write = open(filename, 'w') 
file_read = open("polio.txt") 
user_year = input("Enter a year: ") 
while True: 
    try: 
     for line in file_read: 
      year = int(line[68:74]) 
      millenium = int(line[68:69]) 
      century = int(line[68:70]) 
      decade = int(line[68:71]) 
      user_year == int(user_year) 
      if user_year == year: 
       file_write.write(line) 
      if user_year == millenium: 
       file_write.write(line) 
      if user_year == century: 
       file_write.write(line) 
      if user_year == decade: 
       file_write.write(line) 
    except ValueError: 
     if user_year == {"", "all", "ALL"}: 
       file_write(line[:74]) 
     file_read.close 

從本質上講,所有我需要做的是找到一種方法來比較用戶想要在文本的那些歲月文件同時還評估一個空字符串,幷包含短語的字符串「ALL」或「全部」

+0

現在的錯誤是什麼? –

+0

你的'user_year == int(user_year)'可能因爲用戶輸入的內容不同而可能會有錯誤 – Onilol

+0

@Onilol這就是除了ValueError塊處理之外的嘗試。 –

回答

0

您可以使用str.isdigit()來檢查,如果輸入的是一個合法的整數如下所示:

filename = input("Enter an output file name: ") 
file_write = open(filename, 'w') 
file_read = open("polio.txt") 
user_year = input("Enter a year: ") 

# check for empty string after removing white spaces 
# OR check if answer is all or ALL 
all_option_selected = user_year.strip().lower() in {"", "all"} 
# calculate year once outside the loop if input is valid integer 
if user_year.strip().isdigit(): 
    user_year = int(user_year) 
else: 
    user_year = None 
try: 
    while True: 

     for line in file_read: 
      year = int(line[68:74]) 
      millenium = int(line[68:69]) 
      century = int(line[68:70]) 
      decade = int(line[68:71]) 

      if all_option_selected: 
       file_write(line[:74]) 
       # continue with next line since user did not enter a valid year 
       continue 

      if user_year is None: 
      # user year is not valid number and all option was not selected 
      # so we break out of the loop since input is invalid 
       break 
      if user_year == year: 
       file_write.write(line) 
      if user_year == millenium: 
       file_write.write(line) 
      if user_year == century: 
       file_write.write(line) 
      if user_year == decade: 
       file_write.write(line) 
finally: 
    file_read.close() 
    file_write.close() 
1

我我給你幾件,希望他們會幫助你兒子關於個別組件,所以你可以構建程序,但你認爲合適。

文件訪問

其一,較爲公認的「Python化」做文件訪問使用「上下文管理器」的方式。幸運的是,open聲明支持:

with open('polio.txt') as f: 
    # do stuff here 

這會自動處理關閉文件時的上下文離開,不管是否是一個錯誤來完成。這可以防止您必須跟蹤文件關閉並潛在地犯錯。你可以打開文件打開和處理到不同的功能,以減少額外的嵌套,如果它困擾你。

更好地請求原諒比接受

另一個Python的成語是,它是更好地請求原諒比接受。而不是試圖去檢查一個字符串是否是一個數字,因爲其他回答者的建議,只是試圖將它轉換爲整數和處理的情況時,它不是:

try: 
    user_year = int(user_year) 
except ValueError: 
    pass 

然後,你可以很容易地檢查是否後面的值是「all」。

檢查,如果一個項目是在一個可迭代

您試圖查看用戶是否已經通過了「全部」這裏有一些變化:

if user_year == {"", "all", "ALL"}: 
    # do stuff here 

這行不通,因爲user_year將永遠不會是一組字符串,你正在比較。相反,使用in語句來測試迭代器是否包含該項目:

if user_year in {"", "all", "ALL"}: 
    # do stuff here