2014-12-04 121 views
0

目標是運行模塊「printReport」,它讀取文件「arrivals_14_16.txt」,並將文件的前四行寫入文件「text.txt」。但它只寫第一行。如何使用導入從文件寫入另一個文件?

在模塊「readInput.py」中的函數「headerArrivalsFile」中,如果我離開「print line」,最後該函數打印前四行,但如果我在最後留下「return line」它只返回第一行。

但是,模塊「printReport.py」中的「operationReport」函數只在最後如果離開「返回」功能「headerArrivalsFile」,如果我離開「打印」模塊「printReport.py」停止加工。

模塊:readInput.py

def headerArrivalsFile(file_name): 
    """ 
    """ 
    inFile = open(file_name, "r") 
    for line in inFile: 
     if "Arrivals:" in line: 
      break 
     return line, ## print line, ## (How do I put this work with -> return line,) 
    inFile.close() 

模塊:printReport.py

from readInput import headerArrivalsFile 

def operationReport(inputFile, outputFile): 
    """" 
    """" 
    inFile = open(inputFile, "r") 
    outFile = open(outputFile, "w") 
    for line in headerArrivalsFile(inputFile): 
     outFile.write(line) 
    outFile.close() 
    inFile.close() 

INFILE:arrivals_14_16.txt

Airport: Neverland 
Number of belts: 3 
Day: 06:11:2014 
Period: from 14:00 to 16:00 
Arrivals: 
KLM75, Amsterdam, 14:35, 60, 50 
AF111, Paris, 14:20, 50, 64 
LH333, Frankfurt, 14:10, 112, 203 
KLM71, Madrid, 14:55, 120, 100 
TAP103, Salvador, 15:20, 174, 210 
LH123, Berlin, 15:10, 115, 210 

不過outFile:test.txt的(我想什麼得到)

Airport: Neverland 
Number of belts: 3 
Day: 06:11:2014 
Period: from 14:00 to 16:00 

不過outFile:test.txt的(我能得到什麼)

Airport: Neverland 
+0

在函數中,將'return'替換爲'yield'使其成爲發生器。 – 2014-12-04 12:47:22

回答

0

的問題出在什麼headerArrivalsFile之間的不匹配()做,並且調用代碼期望它做的事情。這條線:

for line in headersArrivalFile(inputFile): 

告訴Python函數將返回的東西它會遍歷(字符串,序列,映射,或發電機)。你的功能(完全如圖所示)

def headerArrivalsFile(file_name): 
    """ 
    """ 
    inFile = open(file_name, "r") 
    for line in inFile: 
     if "Arrivals:" in line: 
      break 
      return line, ## print line, ## (How do I put this work with -> return line,) 
    inFile.close() 

返回無,所以我很驚訝你看到任何輸出。返回之前的「休息」會讓您直到找到「抵達」線路時關閉。如果你沒有找到它,那麼你就會退出循環並關閉文件。這兩條路線都不返回任何值。

所以需要先解決。你不需要任何的循環,簡單地說:

def headerArrivalsFile(file_name): 
    with open(file_name,"r") as infile: 
     # Read the entire file, stripping *only* newlines 
     contents = [l.rstrip('\n') for l in infile] 

    if "Arrivals:" in contents: 
     return infile[:infile.index("Arrivals:")] 

    return contents 

注「與」使用自動關閉文件看完後。

我們調用函數

def operationReport(inputFile, outputFile): 
    """" 
    """" 
    inFile = open(inputFile, "r") 
    outFile = open(outputFile, "w") 
    for line in headerArrivalsFile(inputFile): 
     outFile.write(line) 
    outFile.close() 
    inFile.close() 

您打開headerArrivalsFile()的文件,所以在這裏再次打開它沒有任何意義。此外,再次使用'with'以確保文件即使在例外情況下也被關閉。

def operationReport(inputFile, outputFile): 
    with open(outputFile, "w") as outFile: 
     for line in headerArrivalsFile(inputFile): 
      outFile.write(line+'\n') 

另外請注意我已經加回剝離換行符

+0

我會嘗試你的代碼。關於「迴歸」是錯位的。應該與「如果」而不是「與」一致「。 – 2014-12-04 19:22:47

+0

好的,這解釋了你的「返回一行」的評論。所以你的函數一讀到第一行就退出。 operationReport()中的for循環然後迭代你返回的行中的字符並一次寫出一個字符。請記住,字符串(非常奇怪)非常像字符列表。 – kdopen 2014-12-04 19:34:25

+0

實際上,剛剛發現了「return line」中的鬼祟逗號,它使得返回的值成爲一個元組 - 所以它只是在一個hit中寫出該行。 – kdopen 2014-12-04 19:38:08

0

「迴歸」停止功能的執行。無論代碼位於何處,它都會停在「返回」處或者沒有更多代碼執行時,以先到者爲準。

將結果放入列表中,然後返回該列表或使用yield代替。

相關問題