Python、控制台和导出到文件

Python、控制台和导出到文件,python,function,docx,Python,Function,Docx,我有一个将文本打印到控制台的功能。下面是代码的一个版本(它实际上是一个故事的很多行,所以我要总结一下。)我的问题是-是否还有其他函数可以编写来获取所有的_text()并生成一个docx文件?我已经成功地创建了一个.txt文件,但理想情况下我希望创建一些带有格式选项的文件 来自docx导入文档 文件=文件() def all_text(): 打印(“第1行\n第2行\n第3行”) 文档。添加段落(所有文本()) document.save(“demo.docx”) 文档。添加段落()需要一个字符串

我有一个将文本打印到控制台的功能。下面是代码的一个版本(它实际上是一个故事的很多行,所以我要总结一下。)我的问题是-是否还有其他函数可以编写来获取所有的_text()并生成一个docx文件?我已经成功地创建了一个.txt文件,但理想情况下我希望创建一些带有格式选项的文件

来自docx导入文档
文件=文件()
def all_text():
打印(“第1行\n第2行\n第3行”)
文档。添加段落(所有文本())
document.save(“demo.docx”)

文档。添加段落()
需要一个字符串。您的
all_text()
函数不是返回字符串,而是写入
sys.stdout
(默认情况下会重定向到控制台)并(隐式地)返回
None

干净的解决方案当然是更改
all_text()
函数,使其返回字符串,而不是写入
sys.stdout
ie

def all_text():
    return "Line1\nLine2\nLine3"
如果您的实际函数实际上在不同的位置进行大量打印和/或调用自己打印到标准输出等的函数,使得“干净的解决方案”不切实际或过于昂贵,您也可以通过将
sys.stdout
重定向到
StringIO
并将收集的值发送到
add\u段落
,进行破解,即:

import sys
try:
   from io import StringIO # py3
except ImportError:
   from cStringIO import StringIO

def all_text():
     print("Line1\nLine2\nLine3")


def get_all_text():
    sys.stdout = buffer = StringIO
    try:
        all_text()
        return  buffer.getvalue()
    finally:
        sys.stdout = sys.__stdout__

document.add_paragraph(get_all_text())

@我对这个文档很熟悉,问题是我的函数不再被视为字符串,所以我无法让它工作。如果我能绕过这个问题,那么上面的链接正是我想要使用的。为什么你的函数不再被视为字符串?@Jamie我刚刚用更完整的代码更新了这个问题。我假设它生成一个空的平铺,因为函数不是一个字符串。您的函数打印一个字符串,但看起来不返回任何内容<代码>文档。添加段落(…)需要输入。如果您的函数没有返回任何内容,则不会添加任何内容。看一看。希望它能清楚地表明函数需要向调用者传回一个值。谢谢。我对clean函数感兴趣,所以我很欣赏这个建议。它让我在需要的地方得到更多。我不能简单地返回“Line123”,我必须设置一个等于字符串的变量,然后返回变量。