kin*_*ing 8 python excel performance openpyxl
我在python中使用openpyxl,我正在尝试运行50k行并从每行中获取数据并将其放入文件中.然而......我发现的是,当我进入它时,它的运行速度越来越慢.第一条1k线超快,不到一分钟,但在此之后,下一条1k线需要更长,更长和更长的时间.
我正在打开一个.xlsx文件.我想知道将.txt文件作为csv或其他东西打开或读取json文件是否更快?或者以某种方式转换为更快读取的东西?
我在给定列中有20个唯一值,然后每个值的值都是随机的.我正在尝试为每个值获取整个唯一值列的字符串.
价值1:1243,345,34,124,价值2:1243,345,34,124等
我正在运行值列表,查看文件中是否存在该名称,如果存在,则它将访问该文件并向其追加新值,如果该文件不存在,则会创建该文件,然后将其设置为追加.我有一个字典,其中包含所有"追加写入文件"的东西,所以无论何时我想写一些东西,它都会获取文件名,并且附加的东西将在dict中可用,它会查找它并且写入该文件,因此每次运行时都不会继续打开新文件.
第一个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
Run Code Online (Sandbox Code Playgroud)
我在上面的代码中添加了一些时间戳,它不存在,但你可以看到下面的输出.我看到的问题是,每增加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
Run Code Online (Sandbox Code Playgroud)
我应该说清楚的事情......我不知道提前值的名称,也许我应该通过并在一个单独的python脚本中抓取这些以使其更快?
其次,我需要一个由逗号分隔的所有值的字符串,这就是为什么我将它放入文本文件中以便稍后获取.我正在考虑按照向我建议的列表进行操作,但我想知道是否会出现同样的问题.我认为这个问题与读取excel有关.无论如何,我可以用逗号分隔它的字符串,我可以用另一种方式.
或者也许我可以尝试/捕获而不是每次都搜索文件,如果有错误,我可以假设创建一个新文件?也许每次查找都会让它变得非常慢?如果文件存在?
这个问题是我原来的延续,我从那里得到了一些建议.... 在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]))
Run Code Online (Sandbox Code Playgroud)
看来您只需要 B 列中的单元格。在这种情况下你可以使用ws.get_squared_range()限制要查看的单元格数量。
for row in ws.get_squared_range(min_col=2, max_col=2, min_row=1, max_row=ws.max_row):\n for cell in row: # each row is always a sequence\n filename = cell.value\n if os.path.isfilename(filename):\n \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n目前尚不清楚发生了什么else代码分支发生了什么,但您可能应该在完成打开的所有文件后立即关闭它们。