python - 将每个带有标题的 Excel 电子表格行保存在单独的 .txt 文件中(保存为参数样本以供模拟程序读取)
问题描述
我是一名建筑能源模拟建模师,有一个 Excel 问题,可以使用参数样本(使用 Monte Carlo 生成的样本)进行自动化大规模模拟。现在我在保存样本时有以下问题:
我想以“特殊”方式将 Excel 电子表格的每一行保存在单独的 .txt 文件中,以供模拟程序读取。
假设,我有以下 excel 文件,下面有 4 个参数(a、b、c、d)和 20 个值:
a b c d
2 3 5 7
6 7 9 1
3 2 6 2
5 8 7 6
6 2 3 4
该电子表格的每一行代表一个模拟参数样本。我想将每一行存储在一个单独的 .txt 文件中,如下所示(因此此电子表格有 5 个“.txt”文件):
“1.txt”应包含:
a=2;
b=3;
c=5;
d=7;
“2.txt”应包含:
a=6;
b=7;
c=9;
d=1;
对于文件“3.txt”、“4.txt”和“5.txt”,依此类推。
因此,基本上将标题与其对应的值匹配在单独的 .txt 文件中的每一行(“标题等于值;”)。
是否有执行此操作的 Excel 加载项,还是使用一些 VBA 代码更好?有人有什么想法吗?
(我在模拟建模方面没有经验,但在编程方面没有经验,因此在 Excel 中这个相当简单的参数样本保存问题。(如果这对你们来说更容易,也欢迎使用 Python 中的解决方案))
解决方案
我的想法是一起使用Python
,Pandas
因为它是最灵活的解决方案之一,因为您的用例将来可能会扩展。
我会尽量让这件事变得简单。尽管我假设您拥有 Python,但您知道如何通过pip
or安装软件包,conda
并且准备好在您使用的任何系统上运行 python 脚本。
首先,您的脚本需要将pandas
文件导入并读入DataFrame
:
import pandas as pd
df = pd.read_xlsx('path/to/your/file.xlsx')
(请注意,您可能需要安装该xlrd
软件包,除了pandas
)
现在您拥有了一个强大的数据结构,您可以通过多种方式对其进行操作。我想最直观的方法是遍历所有项目。使用字符串格式,这是最好的解释here并按照您需要的方式将字符串放在一起:
outputs = {}
for row in df.index:
s = ""
for col in df.columns:
s += "{}={};\n".format(col, df[col][row])
print(s)
现在您只需要使用 python 的 io 方法写入文件open
。我将仅通过行的索引来命名文件,但此解决方案将覆盖较早运行此脚本创建的较旧的文本文件。你可能不想添加一些独特的东西,比如日期和时间或你读到的文件的名称,或者通过多次运行脚本来进一步增加文件名,例如这样。
我们一起得到:
import pandas as pd
df = pd.read_excel('path/to/your/file.xlsx')
file_count = 0
for row in df.index:
s = ""
for col in df.columns:
s += "{}={};\n".format(col, df[col][row])
file = open('test_{:03}.txt'.format(file_count), "w")
file.write(s)
file.close()
file_count += 1
请注意,这可能不是最优雅的方式,并且有一个衬里,但由于您不是程序员,我认为您可能更喜欢更直观的方式,您可以轻松地调整自己。
推荐阅读
- angular - Popover + Angular + Bootstrap 4.3 失败
- django - 图像没有从静态文件中加载
- jenkins - Jenkins 和 bitbucket 网络挂钩
- c# - 我正在尝试使用来自 Avaya 办公室管理器 API 的数据。CertificateValidationCallback 导致错误
- sql - 如何在 oracle sql 中按日期执行 CASE
- c# - 我使用 SvcUtil 从 WSDL 创建类。我要反序列化成什么?
- swift - GMSMarker 渲染和延迟问题
- node.js - Azure Functions NodeJS:使用 Azure Visual Studio 代码扩展时 Https 请求不起作用
- ruby-on-rails - 循环在本地环境中工作,但在部署到 Heroku 时不工作
- azure - Azure Blob 存储中的 HTML 无法加载网站图标(错误 400)