python - 在 OpenPYXL 中运行 50k 行 Excel 文件的最快方法

标签 python excel performance openpyxl

我在 python 中使用 openpyxl,我正在尝试运行 50k 行并从每一行中获取数据并将其放入文件中。但是.. 我发现它运行得越慢越好。前 1k 行非常快,不到一分钟,但之后的 1k 行需要越来越长的时间。

我正在打开一个 .xlsx 文件。我想知道将 .txt 文件打开为 csv 或其他文件或读取 json 文件或其他文件是否更快?或者以某种方式转换成阅读速度更快的东西?

我在给定列中有 20 个唯一值,然后每个值的值都是随机的。我正在尝试为每个值获取整个唯一值列的字符串。

值 1:1243,345,34,124, 值 2:1243,345,34,124, 等等等等

我正在遍历值列表,查看名称是否存在于文件中,如果存在,那么它将访问该文件并将新值附加到它,如果文件不存在,它将创建文件,然后将其设置为追加。我有一个字典,里面有所有“追加写文件”的东西,所以每当我想写东西的时候,它会抓取文件名,追加的东西在字典中可用,它会查找并写入该文件,因此它不会在每次运行时都打开新文件。

第一个 1k 用了不到一分钟..现在我有 4k 到 5k 的记录,它已经准备好运行 5 分钟..随着记录的增加,它似乎需要更长的时间,我想知道如何加快它向上。它根本不打印到控制台。

writeFile = 1
theDict = {}

for row in ws.iter_rows(rowRange):
    for cell in row:
        #grabbing the value
        theStringValueLocation = "B" + str(counter)
        theValue = ws[theStringValueLocation].value
        theName = cell.value
        textfilename = theName + ".txt"

        if os.path.isfile(textfilename):
            listToAddTo = theDict[theName]
            listToAddTo.write("," + theValue)
            if counter == 1000:
                print "1000"
                st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')

        else:
            writeFileName = open(textfilename, 'w')
            writeFileName.write(theValue)
            writeFileName = open(textfilename, 'a')
            theDict[theName] = writeFileName
        counter = counter + 1

我在上面的代码中添加了一些时间戳,它不存在,但是你可以看到下面的输出。我看到的问题是它每运行 1k 就会越来越高。第一次 2 分钟,然后 3 分钟,然后 5 分钟,然后 7 分钟。当它达到 50k 时,我担心它会花费一个小时左右,而且会花费太长时间。

1000
2016-02-25 15:15:08
20002016-02-25 15:17:07
30002016-02-25 15:20:52
2016-02-25 15:25:28
4000
2016-02-25 15:32:00
5000
2016-02-25 15:40:02
6000
2016-02-25 15:51:34
7000
2016-02-25 16:03:29
8000
2016-02-25 16:18:52
9000
2016-02-25 16:35:30
10000

有些事情我应该说清楚..我事先不知道值的名称,也许我应该运行并在单独的 python 脚本中获取它们以加快速度?

其次,我需要一个由逗号分隔的所有值组成的字符串,这就是为什么我将其放入文本文件以供稍后获取的原因。我正在考虑按照向我建议的列表来做,但我想知道这是否会遇到同样的问题。我认为问题与读取 excel 有关。无论如何,我可以从中得到一个用逗号分隔的字符串,我可以用另一种方式来做。

或者也许我可以尝试/捕获而不是每次都搜索文件,如果有错误,我可以假设创建一个新文件?也许每次查找都让它变得非常慢?如果文件存在?

这个问题是我在这里的原始问题的延续,我从那里采纳了一些建议.... What is the fastest performance tuple for large data sets in python?

最佳答案

我认为您要做的是从该行的 B 列中获取一个键,并将其用于要追加的文件名。让我们加快速度:

from collections import defaultdict
Value_entries = defaultdict(list) # dict of lists of row data

for row in ws.iter_rows(rowRange):
    key = row[1].value

    Value_entries[key].extend([cell.value for cell in row])

# All done. Now write files:
for key in Value_entries.keys():
    with open(key + '.txt', 'w') as f:
        f.write(','.join(Value_entries[key]))

关于python - 在 OpenPYXL 中运行 50k 行 Excel 文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35638117/

相关文章:

Python:递归创建带有条件的整数列表的列表

excel - 使用 Excel 求解器生成多个最优解

c++ - SDL 和 c++——在玩家身后留下踪迹的更有效方式?

performance - 优化MLT Elasticsearch查询

python - 匿名文件对象何时/如何关闭?

python - 在 python 中转义 HTML。应用引擎

python - 如何执行200个功能的错误处理?

vba - 如何将数据从csv文件复制到其他excel文件

java - Excel 下拉使用 DataValidationHelper (POI)

c++ - SSE,行主要与列主要性能问题