将函数输出写入文本文件
Writing function output to text file
我想将 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。任何人都可以建议将此输出写入文件的方法吗?
谢谢!
您需要 return 一个字符串,而不是在 write_to_file()
中打印您的输出,以便您可以将其输出到文件。如果它可能是一个长字符串,请参阅 this article 以了解 python.
中的有效字符串连接
您的 f.write()
不起作用的原因是 write_to_file()
使用 print()
输出。 print()
写入我们所说的 "standard output" 或简称为标准输出。默认情况下,stdout 是您 运行 您的程序所在的终端。
操作系统允许您将标准输出重定向到文件。您可以使用如下命令执行此操作:
python program.py > output.txt
执行此操作时,您不会在控制台中看到任何输出。相反,您可以在程序完成 运行ning 后打开 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
。此更改留作 reader.
的练习
我想将 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。任何人都可以建议将此输出写入文件的方法吗?
谢谢!
您需要 return 一个字符串,而不是在 write_to_file()
中打印您的输出,以便您可以将其输出到文件。如果它可能是一个长字符串,请参阅 this article 以了解 python.
您的 f.write()
不起作用的原因是 write_to_file()
使用 print()
输出。 print()
写入我们所说的 "standard output" 或简称为标准输出。默认情况下,stdout 是您 运行 您的程序所在的终端。
操作系统允许您将标准输出重定向到文件。您可以使用如下命令执行此操作:
python program.py > output.txt
执行此操作时,您不会在控制台中看到任何输出。相反,您可以在程序完成 运行ning 后打开 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
。此更改留作 reader.