2014-12-04 153 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代替。

相关问题