我知道之前也曾问过类似的问题。但我仍然无法找出处理程序数据的最佳方法
我有一个大的文本文件(50,000至5,000,000行文本)。我需要处理此文件的每一行并将其写入数据框,以便可以对它们进行一些数据分析。
数据框有9列,大多数为浮点型,一些字符串为否。行〜没有。输入文件中的行数
当前,我正在使用“ with open ..”逐行读取此文件,然后使用正则表达式提取所需的数据并将其作为一行写入到数据框中。由于这正在进行For循环,因此需要永远完成。
做到这一点的最佳方法是什么?任何指针或示例程序?我什至应该使用数据框吗?
这是我的代码。
def gcodetodf(self):
with open(self.inputfilepath, 'r') as ifile:
lflag = False
for item in ifile:
layermatch = self.layerpattern.match(item)
self.tlist = item.split(' ')
self.clist = re.split(r"(\w+)", item)
if layermatch and (str(self.tlist[2][:-1]) == 'end' or int(self.tlist[2][:-1]) == (self.endlayer + 1)):
break
if (layermatch and int(self.tlist[2][:-1]) == self.startlayer) or lflag is True:
lflag = True
# clist = re.split(r"(\w+)", item)
map_gcpat = {bool(self.gonepattern.match(item)): self.gc_g1xyef,
bool(self.gepattern.match(item)): self.gc_g1xye,
bool(self.gtrpattern.match(item)): self.gc_g1xyf,
bool(self.resetextpattern.match(item)): self.gc_g92e0,
bool(self.ftpattern.match(item)): self.gc_ftype,
bool(self.toolcompattern.match(item)): self.gc_toolcmt,
bool(self.layerpattern.match(item)): self.gc_laycmt,
bool(self.zpattern.match(item)): self.gc_g1z}
map_gcpat.get(True, self.contd)()
# print(self.newdataframe)
写入数据框的示例函数如下所示:
def gc_g1xye(self):
self.newdataframe = self.newdataframe.append(
{'Xc': float(self.tlist[1][1:]), 'Yc': float(self.tlist[2][1:]), 'Zc': self.gc_z,
'E': float(self.tlist[3][1:]),
'F': None, 'FT': self.ft_var, 'EW': self.tc_ew, 'LH': self.tc_lh, 'Layer': self.cmt_layer},
ignore_index=True)
样本输入文件:
........
G1 X159.8 Y140.2 E16.84505
G1 X159.8 Y159.8 E17.56214
M204 S5000
M205 X30 Y30
G0 F2400 X159.6 Y159.8
G0 X159.33 Y159.33
G0 X159.01 Y159.01
M204 S500
M205 X20 Y20
;TYPE:SKIN
G1 F1200 X140.99 Y159.01 E18.22142
G1 X140.99 Y140.99 E18.8807
G1 X159.01 Y140.99 E19.53999
G1 X159.01 Y159.01 E20.19927
M204 S5000
M205 X30 Y30
G0 F2400 X150.21 Y150.21
M204 S500
M205 X20 Y20
G1 F1200 X149.79 Y150.21 E20.21464
G1 X149.79 Y149.79 E20.23
G1 X150.21 Y149.79 E20.24537
G1 X150.21 Y150.21 E20.26073
M204 S5000
M205 X30 Y30
G0 F2400 X150.61 Y150.61
M204 S500
M205 X20 Y20
G1 F1200 X149.39 Y150.61 E20.30537
G1 X149.39 Y149.39 E20.35
G1 X150.61 Y149.39 E20.39464
..........
答案 0 :(得分:1)
请注意,DataFrame.append返回的是旧DataFrame的副本,其中添加了新行:它不能就地工作。然后使用append逐行构造一个DataFrame,它将在O(n ^ 2)而不是O(n)中工作,如果您有500万行,这将是非常糟糕的...
您要做的是先将每一行追加到列表中(字典列表就可以了),然后在完成所有解析后从中创建DataFrame对象。这样会更快,因为追加到列表的时间是固定的,因此总的复杂度应该是O(n)。
waffle(basedata, rows = 2, colors = c("blue", "red"))
这是最好的方法吗?在我看来,这是一个不错的开始。您应该使用DataFrame吗?从您想对数据进行解析后说的话来看,DataFrame听起来是个不错的选择。
作为随机无关的技巧,我建议使用tqdm软件包来显示for循环的进度条。它非常易于使用,可以帮助您判断是否值得等待该循环完成!