首页 > 解决方案 > 在 for 循环中调用函数以使用 sys.stdout 写入文本文件

问题描述

因此 for 循环中的前两条语句执行 & 被写入文本文件,但函数元素 (y) 尚未写入文件。它只是显示为“无”。任何帮助表示赞赏!

这是我的代码:

def textSummary():
    titles = ["Variable Summary", "Preview of the first & last 5 records in the set, data shape, data types etc.", "Statistical Summary - Mean, median, standard deviations etc.", "Statistical Summary of each Species"]
    funList = [dataInfo(), summaryAll(), summaryBySpecies(), countSpecies()]
    sys.stdout = open ('variableSummary.txt', 'w') 
    for x, y in zip(titles, funList):
        print(x)
        print(astrixBorder())
        y

标签: pythonlistfor-loopsys

解决方案


这是我对正在发生的事情的猜测。

首先,您可能已经这样定义astrixBorder(或类似的):

def astrixBorder():
  print("this")
  print("that")

虽然你没有明确写出来,但是这里的返回值是None,和你写的一样。

def astrixBorder():
  print("this")
  print("that")
  return None

这意味着循环中的print调用是有效的:for

print(x)
print(None) # and as a side-effect, print some *'s

y不会打印in循环,for因为您从不打印print(y). 以非交互方式(例如到文件)打印值与在 REPL 中评估表达式并看到 REPL为您打印值不同。

现在应该更清楚为什么你会得到你所做的输出。

要修复它,只需不要print设置值astrixBorder(),而是执行. 例如printy

print(x)
astrixBorder()
print(y)

另外,您通过更改打印到文件的方式sys.stdout可能会在以后给您带来麻烦,并使您的代码的读者感到困惑。我认为您可能选择了这种方法,因为astrixBorder打印到标准输出。但更好、更清晰的方法是简单地更改astrixBorder为将输出流作为参数,并使用open上下文管理器写入文件(并自动关闭)。例如:

def astrixBorder(out):
  print("this", file=out)
  print("that", file=out)

  
def textSummary():
  titles = ["Variable Summary", "Preview of the first & last 5 records in the set, data shape, data types etc.", "Statistical Summary - Mean, median, standard deviations etc.", "Statistical Summary of each Species"]
  funList = [dataInfo(), summaryAll(), summaryBySpecies(), countSpecies()]
  with open('variableSummary.txt', 'w') as out:
    for x, y in zip(titles, funList):
      print(x, file=out)
      astrixBorder(out)
      print(y, file=out)

推荐阅读