【问题标题】:Writing function output to text file将函数输出写入文本文件
【发布时间】:2020-02-22 00:23:57
【问题描述】:

我希望将 pandas 数据框的内容写入文本文件。这是我正在使用的数据框的示例:

last_week = pd.date_range(start=(datetime.today() - timedelta(weeks=1)), end=datetime.today()).map(lambda x: x.strftime('%Y-%m-%d'))

df = pd.DataFrame(index=pd.MultiIndex.from_product([list(last_week), ['A', 'B', 'C']]),
                  data={'Category 1':np.random.randint(100, size=24),
                        'Category 2':np.random.randint(100, size=24)})

df.index = df.index.set_levels([pd.to_datetime(df.index.levels[0], format='%Y-%m-%d'), df.index.levels[1]])
df.index.set_names(['Day', 'App Name'], level=[0,1], inplace=True)

我编写了一个函数,以我想要的格式输出数据帧内容:

def write_to_file():
    for n in df.reset_index().index:
        row = df.reset_index().iloc[n]
        row = row[row.notnull()]

        print(f"""
\tDay: {datetime.strftime(row.loc['Day'], '%Y-%m-%d')}
\tApp: {row.loc['App Name']}""")

        for i in row.index[2:]:
            print(f"\t{i}: {round(row.loc[i], 2)}")

当我调用此函数时,它会输出以下内容:

    Day: 2020-02-13
    App: A
    Category 1: 6
    Category 2: 73

    Day: 2020-02-13
    App: B
    Category 1: 39
    Category 2: 41

    Day: 2020-02-13
    App: C
    Category 1: 15
    Category 2: 15

    Day: 2020-02-14
    App: A
    Category 1: 26
    Category 2: 8

    Day: 2020-02-14
    App: B
    Category 1: 72
    Category 2: 8

    Day: 2020-02-14
    App: C
    Category 1: 62
    Category 2: 32

    Day: 2020-02-15
    App: A
    Category 1: 76
    Category 2: 21

    Day: 2020-02-15
    App: B
    Category 1: 35
    Category 2: 19

但是,当我尝试将函数输出写入文件时...

with open('./filepath', 'w') as f:
    f.write(write_to_file())

它不起作用,因为函数输出是 Nonetype。谁能建议将此输出写入文件的方法?

谢谢!

【问题讨论】:

    标签: python pandas function file-writing


    【解决方案1】:

    您的f.write() 不起作用的原因是write_to_file() 使用print() 输出。 print() 写入我们所谓的“标准输出”或简称为 stdout。默认情况下,stdout 是您运行程序的终端。

    操作系统允许您将标准输出重定向到文件。您可以使用如下命令执行此操作:

    python program.py > output.txt
    

    执行此操作时,您不会在控制台中看到任何输出。相反,您可以在程序完成运行后打开output.txt 文件并查看那里的输出。

    此解决方案的优点是无需对 Python 代码进行任何更改即可工作。它也是命令行程序的通用标准。或者,您可以从 python 代码写入文件。这需要打开一个文件,你知道怎么做。然后你必须打电话给f.write() 而不是print()

    def write_to_file():
        with open('output.txt') as f:
            for n in df.reset_index().index:
                row = df.reset_index().iloc[n]
                row = row[row.notnull()]
    
                f.write(f"""
    \tDay: {datetime.strftime(row.loc['Day'], '%Y-%m-%d')}
    \tApp: {row.loc['App Name']}""")
    
                for i in row.index[2:]:
                    f.write(f"\t{i}: {round(row.loc[i], 2)}")
    

    为了让这个功能更灵活,你可以为文件名添加一个参数,而不是总是写output.txt。此更改留作读者练习。

    【讨论】:

    • 感谢您的回复。我还添加了一个额外的参数,以允许用户按照您的建议选择文件路径。
    【解决方案2】:

    您需要返回一个字符串,以便将其输出到文件,而不是在write_to_file() 中打印输出。如果它可能是一个长字符串,请参阅this article 以了解 python 中的有效字符串连接。

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2013-11-25
      • 2016-09-10
      • 2016-07-13
      相关资源
      最近更新 更多