我有两个csv文件,一个叫web_file,有25,000行,另一个叫inv_file,有320,000行。
我需要从web_file的第1列中读取每一行,并从inv_file的第1列中的每一行中找到所有匹配的值,并将inv_file中的行写入新的csv文件。
使用只有5-10行的示例文件也不会显示这个问题,所以我列出了一堆随机数,如下所示。
示例web_file:
Inv_SKU,Web_SKU,Brand,Barcode
225481-34,225481-34,brand1,987654321
0486592,0486592,brand2,654871233
AB56412,AB56412,brand2,651273214
LL-123456,LL-123456,brand3,748912349
JLPD-65,JLPD-65,brand6,341541648
20143966,20143966,brand3,82193714
39585824,39585824,brand5,36837329
78066099,78066099,brand4,98398987
44381051,44381051,brand1,9090428
86529443,86529443,brand4,6861670
DF 5645 12,DF 5645 12,brand1,489456138
9845671325,9845671325,brand4,498451315
59634923,59634923,brand4,35828574
85290760,85290760,brand2,64562216
41217184,41217184,brand4,12816236
AE48915,AE48915,brand1,342536125
93981723,93981723,brand2,58155601
inv_file示例:
Inv_SKU,Web_SKU,Brand,Barcode
0486592,0486592,brand2,654871233
LL-123456,LL-123456,brand3,748912349
9845671325,9845671325,brand4,498451315
OI3248967,OI3248967,brand2,891513211
AB56412,AB56412,brand2,651273214
DF 5645 12,DF 5645 12,brand1,489456138
225481-34,225481-34,brand1,987654321
123456789,123456789,brand5,654986413
9841531,9841531,brand3,543254512
AE48915,AE48915,brand1,342536125
JLPD-65,JLPD-65,brand6,341541648
MMMM,MMMM,brand7,384941542
23481-4323,23481-4323,brand3,489123157
98451321,98451321,brand4,498121354
23454152,23454152,brand2,894165123
10275690,10275690,brand2,25612670
20143966,20143966,brand3,82193714
59634923,59634923,brand4,35828574
65800253,65800253,brand5,72318134
67722613,67722613,brand6,93290033
92617199,92617199,brand7,95078073
15379652,15379652,brand1,56281224
85290760,85290760,brand2,64562216
78066099,78066099,brand4,98398987
41217184,41217184,brand4,12816236
87152990,87152990,brand4,95058925
73813369,73813369,brand1,2395994
50201544,50201544,brand1,9167830
93981723,93981723,brand2,58155601
39585824,39585824,brand5,36837329
29082963,29082963,brand3,23393947
23856043,23856043,brand8,57295562
74249006,74249006,brand8,83219065
94376071,94376071,brand8,94887004
14553763,14553763,brand8,14223230
44381051,44381051,brand1,9090428
7598085,7598085,brand1,48967969
56383025,56383025,brand2,68864452
44338055,44338055,brand4,47043853
86529443,86529443,brand4,6861670
我试着使用这段代码,但最终出现了许多重复的行,我想避免这种情况,因为我实际使用的文件太大了,最终有数百万行。
with open('inv_file.csv', 'r') as f1, open('web_file.csv', 'r') as f2:
inv_file = f1.readlines()
web_file = f2.readlines()
with open('result.csv', 'r+') as f3:
result_file = f3.readlines()
while len(result_file) < len(web_file):
for row in inv_file:
for row1 in web_file:
if row[0] in row1[0]:
f3.write(row1)
break
4条答案
按热度按时间gt0wga4j1#
while
循环看起来很混乱,也没有必要。为什么你不只是做简单明显的事情呢?演示:https://ideone.com/g6j2lB
我们不清楚你为什么对输出文件使用
'r+'
模式,或者你是否希望我们也抑制文件中已经存在的行的输出行。如果这是你的要求,也许可以问一个新的问题,提供更多的细节和这个(或另一个)解决方案。3wabscal2#
你真的应该使用csv库解析csv文件。一种方法是存储一个web sku的列表(希望我已经正确理解了),然后根据它检查inv sku。这可以通过传递给csv
writerows()
方法的生成器有效地完成。wvmv3b1j3#
我有两个主意可以解决你的问题。
第1步:在写入之前检查
row1
是否在result_file
中请注意,您解析的值越多,这将花费越多的时间。
第2步:在写入后将
row1
添加到集合中,并在写入前检查row1
是否在此集合中这个版本可能更快(我不确定),但有更高的存储需求,因为所有的行都在集合和结果文件中。
如果可以只比较SKU编号,您也可以在两种情况下使用它们,这应该更快,并且在情况2中也应该占用更少的存储空间。
but5z9lq4#
我将把web_file称为 filter CSV,把inv_file称为 input CSV。
我模拟了一个25_000行的过滤器CSV和一个320_000行的输入CSV。然后我尝试了将所有过滤器ID添加到列表中的方法,然后循环输入行并检查每个输入ID是否在该过滤器列表中,以及是否正在写入输出。
这花了大约70秒的时间来运行。
程序最多需要进行
25_000 x 320_000 = 8_000_000_000
(“8billion”)次比较。我们可以通过使用一个dict来保存过滤器ID,将其减少到320_000次比较。我们不必改变输入的实际过滤,相同的
if row[0] in filter_ids:
语法适用于dict。这花了0.13秒的时间,速度快了500倍以上。一般来说,在dict中查找键比检查一个项目是否在列表中要快很多,特别是对于大列表。在我的机器上,dict方法比列表方法多使用了大约3MB的内存。
你提到了输出中的重复行。我在示例输入中没有看到重复的行,但是如果你需要检查以确保输出中没有重复的ID,你可以再次使用dict: