【问题标题】:How do I write from a file to another using import?如何使用导入从一个文件写入另一个文件?
【发布时间】:2015-02-02 08:27:49
【问题描述】:

目标是运行模块“printReport”,它读取文件“arrivals_14_16.txt”并将文件的前四行写入文件“text.txt”。但它只写了第一行。

在模块“readInput.py”的函数“headerArrivalsFile”中,如果我离开“打印行”,函数最后打印前四行,但如果我离开“返回行”,最后它只返回第一行。

但模块“printReport.py”中的函数“operationReport”仅在我将函数“headerArrivalsFile”最后带有“return”时才有效,如果我离开“print”模块“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

【问题讨论】:

  • 在函数中,将 'return' 替换为 'yield' 使其成为生成器。

标签: python string file import


【解决方案1】:

问题在于 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

注意使用'with'在读取文件后自动关闭文件。

现在是调用函数

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')

另请注意,我已添加回剥离的换行符

【讨论】:

  • 我会试试你的代码。关于“回报”是错位的。应该与“if”而不是“breake”对齐。
  • 好的,这解释了您的“返回一行”评论。因此,您的函数在读取第一行后立即退出。 operationReport() 中的 for 循环然后迭代您返回的行中的字符,并一次将它们写出一个字符。请记住,字符串(以一种奇怪的方式)非常像一个字符列表。
  • 实际上,只是在“返回行”中发现了那个鬼鬼祟祟的逗号,这使得返回值成为一个元组 - 所以它只是一键写出该行。
【解决方案2】:

'return' 停止函数的执行。无论它在代码中的哪个位置,它都会在“返回”或没有更多代码要执行时停止,以先到者为准。

要么将结果放在一个列表中,然后返回该列表,要么改用 yield。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2014-07-24
    • 2021-06-22
    • 2021-02-10
    相关资源
    最近更新 更多