我想创建一个Python脚本来打开csv(或xls)文件,使用输入框我可以将Excel公式复制并粘贴到特定行...然后将其应用于其余的空该列中的行。为了帮助可视化,这是一个例子
DATA, FORMULA
001, [here would be inserted the formula]
002, [here would be populated the amended formula]
003, [here would be populated the amended formula]
004, [here would be populated the amended formula]
所以,想法是有一个脚本,它会让我输入框询问 - 你想从哪一行开始? |答案= B2 - 你想在那里推广什么配方? | “= COUNTIF(A:A,A2)”
...然后它将填充B2列中的公式并自动填充下一个B3,B4,B5和B6,其中公式被调整为特定单元格。我想这样做的原因是我处理大型excel文件的事实,这些文件经常在我的计算机上崩溃,所以我想在不运行Excel本身的情况下执行它。
我做了一些研究adn xlwt可能无法做到这一点。你能帮我找到解决方案,我该怎么做?我很感激您的任何想法和指导。
答案 0 :(得分:0)
不幸的是,如果不在代码中实现电子表格程序(Excel)的一部分,就无法完成您想要做的事情。那里没有捷径。
对于文件格式,Python可以本地处理CSV文件,但我认为您无法将原始公式(而不是数字或文本内容)从CSV导入Excel本身。
由于您已经使用Python,可能最好将逻辑从电子表格移动到程序中:使用Excel或其他电子表格程序输入数据,只输入数字,并使用脚本不要修改工作表,但要实现您需要的计算 - 可能将数据存储在SQL数据库中(Python的内置SQLite将很好地为单个用户应用程序执行,就像在这种情况下) - 并将计算出的数字输出到电子表格文件或者,也许,使用matplotlib直接从Python生成您的打算图表。
那就是说,你要求可以从Python完成 - 但随着数据集的增长,它可能会导致你的一般工作流程越来越复杂 -
Hre - 这些辅助函数将允许您从Excel单元格命名约定转换为数字,反之亦然 - 这样您就可以拥有在Python编程中操作的数字索引。
解析输入的公式来提取单元格 - 地址并不容易,但是
将它们渲染回公式,调整数字索引后应该会轻松很多)。我建议你在脚本中对你的公式进行硬编码,而不是允许输入任何可能的公式。
def parse_num(地址): x =“” for chr in(地址): 如果chr.isdigit(): x + = chr return int(x) - 1
def parse_col(地址): x = 0 for chr in address: 如果chr.isdigit(): 打破 x = x * 26 +(ord(chr.upper()) - ord(“A”)) 返回x
def render_address(col,row): base = 26 power = col // base col_letters =“” tmp_col = col for x in xrange(power,-1,-1): dig = tmp_col //(base ** p) letter = chr(dig + ord(“A”)) col_letters + = letter tmp_col%= base ** p return col_letters + str(row + 1)
现在,如果您愿意在Python中工作,只需将您的数据输入为CSV并使用小型python程序获取结果,而不是尝试将它们放入电子表格中 - 以获取上面的公式{{ 1}}基本上,你想要计算有多少其他行将第一列作为这一行 - 对于750000个数据位置,它在Python中是小菜一碟 - (如果所有数据都不适合RAM,它会变得更加困难 - 但是在2GB机器中大约有1亿个数据点会发生这种情况 - 此时你仍然可以通过专用结构将所有内容都放在RAM中 - 以上它将开始需要更多的逻辑,这将是几行使用正如我上面提到的SQLIte。
现在,给定带有一列数据的CSV文件的代码会生成第二个CSV文件,其中第二列包含第一列中出现的数字总数:
COUNTIF(A:A,A2)
只有当你真正需要按顺序排列所有第一列时才会这样
最后的文件。如果您想要的只是第1列中每个数字的计数,
无论它们出现的顺序如何,你只需要在第一个块之后的import csv
from collections import Counter
data_count = Counter()
with open("data.csv", "rt") as input_file:
reader = csv.reader(input_file)
# skip header:
reader.next()
for row in reader():
data_count[int(row[0])] += 1
# everything is accounted for now - output the result:
with open("data.csv", "rt") as input_file, open("counted_data.csv", "wt") as output_file:
reader = csv.reader(input_file)
writer = csv.writer(output_file)
header = reader.next()
header.append("Count")
writer.writerow(header)
for row in reader():
writer.writerow(row + [str(data_count[int(row[0])])] )
中的数据 - 你可以在Python提示符中以交互方式玩这个数据,并且在几分之一秒内得到的结果需要花费几十分钟的时间。电子表格程序。
如果您的数据集不适合内存,您只需将它们放在数据库中,脚本比此更简单,您仍然可以在几分之一秒内得到结果。