我正在写一个scipt(即一次)我正在从excel文件中读取数据。对于该数据,我根据日期和时间创建一个id。我有一个缺失的变量,它包含在一个txt文件中。 txt文件还有创建id的日期和时间。
现在我想根据id链接excel-file和txt-file中的数据。对不,我正在从txt文件构建两个列表。一个包含id,另一个包含我需要的值。然后,我从id列表中获取索引,其中使用枚举函数的两个数据集中的id相同。我使用该索引从valuelist获取值。代码看起来像这样:
datelist = []
valuelist = []
txtfile = open(folder + os.sep + "Textfile.txt", "r")
ILines = txtfile.readlines()
for i,row in enumerate(ILines):
datelist.append(row.split(",")[1])
valuelist.append(row.split(",")[2])
rows = myexceldata
for row in rows:
x = row[id]
row = row + valuelist[[i for i,e in enumerate(datelist ) if e == x][0]]
然而,这需要很长时间,我想知道是否有更好的方法。
文件看起来像这样:
Excelfile:
Date Time Var1 Var2
03.02.2016 12:53:24 10 27
03.02.2016 12:53:25 10 27
03.02.2016 12:53:26 10 27
TEXTFILE:
Date Time Var3
03.02.2016 12:53:24 16
03.02.2016 12:53:25 20
结果:
Date Time Var1 Var2 Var3
03.02.2016 12:53:24 10 27 16
03.02.2016 12:53:25 10 27 20
03.02.2016 12:53:26 10 27 *)
*)这将是完美的,如果这里的价值与上面相同,但空也没关系
好的,我忘记了一件重要的事情。抱歉:并非所有的excelfile都在文本文件中。最好的选择是在excelfile之前的文本文件的前一次获取var3。但它也可以选择留空而不是。
答案 0 :(得分:1)
如果您的两个文件都按时间顺序排序,那么以下类型的方法会很快:
from heapq import merge
from itertools import groupby, chain
import csv
with open('excel.txt', 'rb') as f_excel, open('textfile.txt', 'rb') as f_text, open('output.txt', 'wb') as f_output:
csv_excel = csv.reader(f_excel)
csv_text = csv.reader(f_text)
csv_output = csv.writer(f_output)
header_excel = next(csv_excel)
header_text = next(csv_text)
csv_output.writerow(header_excel + [header_text[-1]])
for k, g in groupby(merge(csv_text, csv_excel), key=lambda x: x[0:2]):
csv_output.writerow(k + list(chain.from_iterable(cols[2:] for cols in g)))
这假设您的两个输入文件都是csv格式,其工作方式如下:
为所有文件创建csv读取器/写入器。这允许文件自动作为列列表读入,而不需要拆分每一行。
从两个文件中提取标题,并将合并后的表单写入输出。
获取两个输入文件并将其传递给merge
。这将按顺序从任一输入文件返回一行。
将此传递给groupby
,将具有相同日期和时间的行分组。这将返回一个键和一个组,其中键是匹配的日期和时间,该组是匹配行的可迭代。
对于每个分组的条目,将每行的密钥和第2列写入输出文件。 chain
用于生成一个单位列表。
这将为您提供如下输出文件:
Date,Time,Var1,Var2,Var3
03.02.2016,12:53:24,10,27,16
03.02.2016,12:53:25,10,27,20
由于您已经拥有excel数据,因此需要将其作为行/列的列表传递给合并而不是csv_excel
。