我的导入列表是包含不同组件的列表。脚本计算有多少相同的组件 我正在尝试对它们进行排序并将“部分”放在它们面前。
代码:
Using code from @MagunRa
输入文件(新):
Part Value Package Library Position (mm) Orientation
C1 100n C0402 rcl (117.65 40.75) R270
C2 100n C0603 rcl (-48.26 53.34) R0
C3 1u C0402 rcl (-50.8 78.74) R0
C4 1u C0402 rcl (9 63.1) R270
C5 10n-1% C0402 rcl (81.55 39.65) R270
C6 100n C0603 rcl (-54.61 53.34) R0
C7 100n C0402 rcl (-60.96 53.34) R0
C8 100n C0603 rcl (-67.31 53.34) R0
C9 100n C0603 rcl (-73.66 53.34) R0
C10 100n C0402 rcl (117.8 50.55) R270
C11 100n C0603 rcl (-17.78 58.42) R0
C12 100n C0603 rcl (-24.13 58.42) R0
C13 1u C0402 rcl (80.35 45.95) R0
C14 100n C0402 rcl (78.15 52.75) R0
C15 1u C0402 rcl (81.5 44.1) R90
C16 10u C0402 rcl (79.25 40.75) R270
C17 22u C0603 rcl (-59.69 63.5) R0
C18 100n C0603 rcl (-36.83 58.42) R0
C19 100n C0603 rcl (-43.18 58.42) R0
C20 100n C0603 rcl (-49.53 58.42) R0
C21 100u A/3216-18R rcl (-60.96 40.64) R0
C22 100n C0402 rcl (-55.88 58.42) R0
C23 10n C0402 rcl (-64.77 63.5) R0
C24 22u C0603 rcl (-69.85 63.5) R0
C25 100n C0402 rcl (-62.23 58.42) R0
C26 10n C0402 rcl (-74.93 63.5) R0
C27 100n C0402 rcl (83.15 51.4) R0
C28 1u C0402 rcl (78.3 50.25) R180
C29 47uF C0603 rcl (-35.56 53.34) R0
C30 0.5p C0402 rcl (83.8 46.35) MR270
C31 100n C0603 rcl (-74.93 58.42) R0
C32 100n C0603 rcl (-17.78 63.5) R0
C33 10u C0402 rcl (-16.51 68.58) R0
C34 120n C0603 rcl (-24.13 63.5) R0
C34_X5R >2.2u C0402 rcl (-21.59 53.34) R0
C34_X5R1 >2.2u C0402 rcl (-80.01 48.26) R0
C35 10u C0402 rcl (-21.59 68.58) R0
C36 1u C0402 rcl (83.15 52.45) R180
C37 6.8n C0603 rcl (-34.29 63.5) R0
C40 10u C0402 rcl (83.1 42.85) MR180
C53 1u C0603 rcl (-36.83 68.58) R0
C54 12p C0603 rcl (-41.91 68.58) R0
C55 12p C0603 rcl (-46.99 68.58) R0
C56 100u A/3216-18R rcl (-66.04 40.64) R0
C57 100u A/3216-18R rcl (-71.12 40.64) R0
C58 100u A/3216-18R rcl (-76.2 40.64) R0
D1 PD3S160 POWERDI323 diode (-46.99 41.91) R0
D2 PD3S160 POWERDI323 diode (-55.88 41.91) R0
IC1 OPA333DBV SOT23-5 linear (79.2 48.1) R90
J1 MOLEX_47346-0001 Molex-47346-0001 (-39.37 17.78) R0
L3 BLM15HD182SN1 0402 inductors (-53.34 48.26) R0
L4 BLM15HD182SN1 0402 inductors (-69.85 48.26) R0
R1 33M R0603 rcl (82.65 46.3) MR90
R2 10K R0402 rcl (118.85 50.55) R270
R3 2k2 R0402 rcl (-31.75 78.74) R0
R4 10K R0402 rcl (118.85 40.75) R270
R5 10k R0402 rcl (-36.83 78.74) R0
R6 10k R0402 rcl (83.1 43.9) MR0
R7 10k R0603 resistor (-36.83 48.26) R0
R8 2k2 R0402 rcl (106.4 40.8) R90
R9 220 R0603 rcl (-26.67 78.74) R0
R10 100 R0402 rcl (107.85 43.95) R90
R11 2k2 R0402 rcl (106.4 50.65) R270
R12 100 R0402 rcl (107.85 47.45) R270
R13 4.7 R0402 rcl (81.55 41.65) R270
R14 47 R0402 rcl (115.2 40.75) R90
R15 2k2 R0402 rcl (110.85 40.75) R270
R16 47 R0402 rcl (115.2 50.55) R270
R17 10k R0603 resistor (-16.51 48.26) R0
R18 15 R0603 rcl (122.15 43.85) R90
R19 2k2 R0402 rcl (110.85 50.55) R90
R20 10 R0603 rcl (122.15 47.5) R270
R21 10k R0603 resistor (-21.59 48.26) R0
R22 4.7 R0402 rcl (79.95 39.1) R0
R23 47k R0402 rcl (78.35 51.55) R180
R24 1k R0402 rcl (77.85 54.05) R0
R27 1k R0402 rcl (82.6 45.4) R90
R28 20k R0402 rcl (78.2 45.95) R0
R29 0.2 R0603 rcl (80.4 41.1) R90
R35 10K R0402 rcl (80.45 50.25) R0
R36 10k R0603 resistor (-26.67 48.26) R0
R42 500 R0603 resistor (-31.75 48.26) R0
R48 100 R0402 rcl (116.45 40.75) R90
R49 100 R0402 rcl (116.75 50.55) R90
SOT23-1 LTC6240 SOT23-5 artinis (82.3 50.2) MR180
T1 PMV16UN SOT-23 zetex (121 40.75) R90
T2 FMMT617 SOT-23 zetex (108.6 40.85) R180
T3 FMMT717 SOT-23 zetex (-40.64 25.4) R0
T4 FMMT617 SOT-23 zetex (108.6 50.55) R0
T5 PMV16UN SOT-23 zetex (121 50.55) R90
T6 FMMT617 SOT-23 zetex (113 40.65) R0
T8 FMMT617 SOT-23 zetex (113.05 50.65) R180
U$1 BPW34SMD BPW_34_SMD jwasys (80 45.7) MR180
U$2 TPS73433 SOT23-5 artinis (-48.26 15.24) R0
U$4 LED760/850_ROITHNER DUOLED_5MM jwasys (110 45.7) R90
U$5 LED760/850_ROITHNER DUOLED_5MM jwasys (115 45.7) R90
U$6 LED760/850_ROITHNER DUOLED_5MM jwasys (120 45.7) R90
U$7 TM4C123GH6ZRBBGA157 BGA_157_MICROSTAR artinis (-26.67 6.35) R0
U$8 REF3225 SOT95P280X100-6N artinis (82.95 48.95) R90
U$10 TPS73633 SOT23-5 artinis (-55.88 15.24) R0
U$12 BNO055LGA-28 LGA-28 artinis (-59.69 78.74) R0
U$14 ECX-42_CRYSTALECS-160-9-42-CKM-TR ECX-42_CRYSTAL artinis (-67.31 77.47) R0
U$16 HEADER_1.27_7 HEADER_1.27_7 jwasys (-73.66 77.47) R0
U1 ADS8860 SOP50P490X110-10N artinis (85.3 40.35) R0
U6 THS4281DBVT SOT95P280X145-5N artinis (78.85 43.85) R180
代码输出(MagunRa):
Part - Value - Package - Amount
['R29'],0.2,R0603,1
['C30'],0.5p,C0402,1
['R20'],10,R0603,1
['R10', 'R12', 'R48', 'R49'],100,R0402,4
['C1', 'C2', 'C6', 'C7', 'C8', 'C9', 'C10', 'C11', 'C12', 'C14', 'C18', 'C19', 'C20', 'C22', 'C25', 'C27', 'C31', 'C32'],100n,C0402,7
['C1', 'C2', 'C6', 'C7', 'C8', 'C9', 'C10', 'C11', 'C12', 'C14', 'C18', 'C19', 'C20', 'C22', 'C25', 'C27', 'C31', 'C32'],100n,C0603,11
['C21', 'C56', 'C57', 'C58'],100u,A/3216-18R,4
['R2', 'R4', 'R35'],10K,R0402,3
['R5', 'R6', 'R7', 'R17', 'R21', 'R36'],10k,R0402,2
['R5', 'R6', 'R7', 'R17', 'R21', 'R36'],10k,R0603,4
['C23', 'C26'],10n,C0402,2
['C5'],10n-1%,C0402,1
['C16', 'C33', 'C35', 'C40'],10u,C0402,4
['C34'],120n,C0603,1
['C54', 'C55'],12p,C0603,2
['R18'],15,R0603,1
['R24', 'R27'],1k,R0402,2
['C3', 'C4', 'C13', 'C15', 'C28', 'C36', 'C53'],1u,C0402,6
['C3', 'C4', 'C13', 'C15', 'C28', 'C36', 'C53'],1u,C0603,1
['R28'],20k,R0402,1
['R9'],220,R0603,1
['C17', 'C24'],22u,C0603,2
['R3', 'R8', 'R11', 'R15', 'R19'],2k2,R0402,5
['R1'],33M,R0603,1
['R13', 'R22'],4.7,R0402,2
['R14', 'R16'],47,R0402,2
['R23'],47k,R0402,1
['C29'],47uF,C0603,1
['R42'],500,R0603,1
['C37'],6.8n,C0603,1
['C34_X5R', 'C34_X5R1'],>2.2u,C0402,2
['U1'],ADS8860,SOP50P490X110-10N,1
['L3', 'L4'],BLM15HD182SN1,0402,2
['U$12'],BNO055LGA-28,LGA-28,1
['U$1'],BPW34SMD,BPW_34_SMD,1
['U$14'],ECX-42_CRYSTALECS-160-9-42-CKM-TR,ECX-42_CRYSTAL,1
['T2', 'T4', 'T6', 'T8'],FMMT617,SOT-23,4
['T3'],FMMT717,SOT-23,1
['U$16'],HEADER_1.27_7,HEADER_1.27_7,1
['U$4', 'U$5', 'U$6'],LED760/850_ROITHNER,DUOLED_5MM,3
['SOT23-1'],LTC6240,SOT23-5,1
['J1'],MOLEX_47346-0001,Molex-47346-0001,1
['IC1'],OPA333DBV,SOT23-5,1
['D1', 'D2'],PD3S160,POWERDI323,2
['T1', 'T5'],PMV16UN,SOT-23,2
['U$8'],REF3225,SOT95P280X100-6N,1
['U6'],THS4281DBVT,SOT95P280X145-5N,1
['U$7'],TM4C123GH6ZRBBGA157,BGA_157_MICROSTAR,1
['U$2'],TPS73433,SOT23-5,1
['U$10'],TPS73633,SOT23-5,1
我正试图获得输出:
Part - Value - Package - Amount
[C1,C7,C10,C14,C22,C25,C27],100n,C0402,7
Etc,
Etc,
正如您在文件中看到的那样,该部分以字母开头:C,D,R,L等。
是否有可能对其进行排序,以便按字母顺序显示?
答案 0 :(得分:3)
计数器字典不是解决问题的最佳方法,如果要将值与您遇到的第一部分相关联,可以使用以下方法,该方法使用(Value, Package)
元组作为键并设置部分到我们遇到的第一部分与(Value, Package)
配对相关联。使用islice是没有意义的,因为你正在拆分前三列,所以没有真正的好处。使用OrderedDict也将保持文件的顺序:
from collections import OrderedDict
import csv
d = OrderedDict()
with open('test.txt') as f, open("out.csv", "w") as out:
wr = csv.DictWriter(out, fieldnames=["Part", "Value", 'Package', "Amount"])
wr.writeheader()
next(f) # skip header
for line in f:
a, b, c, _ = line.split(None, 3) # split into three columns
key = (b, c) # Value and Package is our key
d.setdefault(key, dict(Amount=0, Part=a, Value=b, Package=c))
d[key]["Amount"] += 1 # increase count every time we see the key
wr.writerows(d.itervalues()) # DictWriter will handle writing the rows
哪个输出:
Part,Value,Package,Amount
C1,1nF,C0603,1
C2,100nF,C0603,8
C3,10uF_Tantalum,C0603,1
C4,22uF,C0603,1
C5,1uF,C0603,1
C13,0.22uF,C0603,1
C14,2.2uF,C0603,2
HDR_PRGRM_NIET_PLAATSEN,HEADER_1.27_6P,HEADER_1.27_6,1
L1,MURATA10UH,R1210,1
R1,22K,R0603,2
R3,100,R0603,4
R4,483,R0603,1
R10,10k,R0603,1
R11,10K,R0603,2
R14,19.6K,R0603,1
TP1,PTR1TP20R,TP20R,4
TP5,PTR1PAD1-13Y,P1-13Y,2
U$1,WML-C20,WML-C20,1
U$4,MCP4921-E/MS,SOP65P490X110-8N,1
U$6,TSV912DFN8_2X2,DFN8_2X2,1
U$9,LTC3525_BOOST,SC70-6,1
U1,REG71055DDCT,SOT95P180X110-6N,1
U2,ATMEGA32L-8MU,QFN50P700X700X100-45N,1
X1,53047-05,53047-05,1
如果您想保留所有部件并在每个部件后添加计数,请保留与(Value, Package)
配对关联的所有部件的列表,而不仅仅是第一部件,并写下每个部件,价值,包装和金额迭代v["Parts"]
将保留与特定(Value, Package)
关联的所有部分,以获取原始订单上的文件,我们需要使用一个键来排序哪个部分出现在文件中的行通过使用dict从我们看到该部分的顺序创建映射:
from collections import defaultdict
import csv
d = defaultdict(lambda: dict(Amount=0, Parts=[], Value=b, Package=c))
with open('foo.txt') as f, open("out.csv", "w") as out:
wr = csv.writer(out)
order = {} # use this later to sort
wr.writerow(["Part", "Value", 'Package', "Amount"])
next(f)
for ind, line in enumerate(f):
a, b, c, _ = line.split(None, 3)
order[a] = ind
key = (b, c)
d[key]["Amount"] += 1
d[key]["Parts"].append(a)
# flatten the Parts so we can sort back to the original order
flat = ((k,v["Amount"],v["Value"],v["Package"]) for v in d.itervalues() for k in
v["Parts"])
# sort by part
wr.writerows(sorted(flat, key=lambda x: order[x[0]]))
哪个输出:
Part,Value,Package,Amount
C1,C0603,1nF,1
C2,C0603,100nF,8
C3,C0603,10uF_Tantalum,1
C4,C0603,22uF,1
C5,C0603,1uF,1
C6,C0603,100nF,8
C7,C0603,100nF,8
C8,C0603,100nF,8
C11,C0603,100nF,8
C12,C0603,100nF,8
C13,C0603,0.22uF,1
C14,C0603,2.2uF,2
C15,C0603,2.2uF,2
C16,C0603,100nF,8
C17,C0603,100nF,8
HDR_PRGRM_NIET_PLAATSEN,HEADER_1.27_6,HEADER_1.27_6P,1
L1,R1210,MURATA10UH,1
R1,R0603,22K,2
R2,R0603,22K,2
R3,R0603,100,4
R4,R0603,483,1
R5,R0603,100,4
R7,R0603,100,4
R10,R0603,10k,1
R11,R0603,10K,2
R12,R0603,100,4
R13,R0603,10K,2
R14,R0603,19.6K,1
TP1,TP20R,PTR1TP20R,4
TP2,TP20R,PTR1TP20R,4
TP3,TP20R,PTR1TP20R,4
TP4,TP20R,PTR1TP20R,4
TP5,P1-13Y,PTR1PAD1-13Y,2
TP6,P1-13Y,PTR1PAD1-13Y,2
U$1,WML-C20,WML-C20,1
U$4,SOP65P490X110-8N,MCP4921-E/MS,1
U$6,DFN8_2X2,TSV912DFN8_2X2,1
U$9,SC70-6,LTC3525_BOOST,1
U1,SOT95P180X110-6N,REG71055DDCT,1
U2,QFN50P700X700X100-45N,ATMEGA32L-8MU,1
X1,53047-05,53047-05,1
我建议保留上面输出的格式,以便您可以使用csv模块轻松再次读取文件。
要获得编辑后的输出,我们只需要将零件更改为列表并添加所有零件:
from collections import OrderedDict
import csv
from itertools import islice
d = OrderedDict()
with open('test.csv') as f, open("out.csv", "w") as out:
_ = list(islice(f, 10)) # skip 10 lines
wr = csv.DictWriter(out, fieldnames=["Parts", "Value", 'Package', "Amount"])
wr.writeheader()
for line in f:
a, b, c, _ = line.split(None, 3) # split into three columns
key = (b, c) # Value and Package is our key
d.setdefault(key, dict(Amount=0, Parts=[], Value=b, Package=c))
d[key]["Amount"] += 1 # increase count every time we see the key
d[key]["Parts"].append(a)
wr.writerows(d.values()) # DictWriter will handle writing the rows
输出:
Parts,Value,Package,Amount
"['C1', 'C7', 'C10', 'C14', 'C22', 'C25', 'C27']",100n,C0402,7
"['C2', 'C6', 'C8', 'C9', 'C11', 'C12', 'C18', 'C19', 'C20', 'C31', 'C32']",100n,C0603,11
"['C3', 'C4', 'C13', 'C15', 'C28', 'C36']",1u,C0402,6
['C5'],10n-1%,C0402,1
"['C16', 'C33', 'C35', 'C40']",10u,C0402,4
"['C17', 'C24']",22u,C0603,2
"['C21', 'C56', 'C57', 'C58']",100u,A/3216-18R,4
"['C23', 'C26']",10n,C0402,2
['C29'],47uF,C0603,1
['C30'],0.5p,C0402,1
['C34'],120n,C0603,1
"['C34_X5R', 'C34_X5R1']",>2.2u,C0402,2
['C37'],6.8n,C0603,1
['C53'],1u,C0603,1
"['C54', 'C55']",12p,C0603,2
"['D1', 'D2']",PD3S160,POWERDI323,2
['IC1'],OPA333DBV,SOT23-5,1
['J1'],MOLEX_47346-0001,Molex-47346-0001,1
"['L3', 'L4']",BLM15HD182SN1,0402,2
['R1'],33M,R0603,1
"['R2', 'R4', 'R35']",10K,R0402,3
"['R3', 'R8', 'R11', 'R15', 'R19']",2k2,R0402,5
"['R5', 'R6']",10k,R0402,2
"['R7', 'R17', 'R21', 'R36']",10k,R0603,4
['R9'],220,R0603,1
"['R10', 'R12', 'R48', 'R49']",100,R0402,4
"['R13', 'R22']",4.7,R0402,2
"['R14', 'R16']",47,R0402,2
['R18'],15,R0603,1
['R20'],10,R0603,1
['R23'],47k,R0402,1
"['R24', 'R27']",1k,R0402,2
['R28'],20k,R0402,1
['R29'],0.2,R0603,1
['R42'],500,R0603,1
['SOT23-1'],LTC6240,SOT23-5,1
"['T1', 'T5']",PMV16UN,SOT-23,2
"['T2', 'T4', 'T6', 'T8']",FMMT617,SOT-23,4
['T3'],FMMT717,SOT-23,1
['U$1'],BPW34SMD,BPW_34_SMD,1
['U$2'],TPS73433,SOT23-5,1
"['U$4', 'U$5', 'U$6']",LED760/850_ROITHNER,DUOLED_5MM,3
['U$7'],TM4C123GH6ZRBBGA157,BGA_157_MICROSTAR,1
['U$8'],REF3225,SOT95P280X100-6N,1
['U$10'],TPS73633,SOT23-5,1
['U$12'],BNO055LGA-28,LGA-28,1
['U$14'],ECX-42_CRYSTALECS-160-9-42-CKM-TR,ECX-42_CRYSTAL,1
['U$16'],HEADER_1.27_7,HEADER_1.27_7,1
['U1'],ADS8860,SOP50P490X110-10N,1
['U6'],THS4281DBVT,SOT95P280X145-5N,1
答案 1 :(得分:0)
这个
cn = Counter(tuple(islice(line.split(), 1, 3)) for line in f)
应该是
cn = Counter(tuple(islice(line.split(), 0, 3)) for line in f)
编辑:使用更新的输入文件,输出不是所需的输出:
C7,100nF,1
C11,100nF,1
C8,100nF,1
答案 2 :(得分:0)
这是一个不太好的方法:
1 from collections import Counter
2 from itertools import islice
3 import sys
4
5 t = open('Componentslist_Count.txt', 'wb')
6 t.write("Part - Value - Package - Amount")
7
8 def getPartDict(lines):
9 tmp=[tuple(islice(line.split(), 0, 2)) for line in lines]
10 for _t in tmp:
11 if _t[1] in part_dict.keys():
12 part_dict[_t[1]].append(_t[0])
13 else:
14 part_dict[_t[1]]=[_t[0]]
15 return part_dict
16
17 with open('test.txt') as f:
18 part_dict={}
19 #f.readline()
20 f.readline()
21 _f=f.readlines()
22 cn = Counter(tuple(islice(line.split(), 1, 3)) for line in _f)
23 part_dict=getPartDict(_f)
24 for k, v in cn.items():
25 t.write("\n")
26 t.write("{l},{},{},{v}".format(l=part_dict[k[0]],*k, v=v))
输出:
Part - Value - Package - Amount
['C3'],10uF_Tantalum,C0603,1
['X1'],53047-05,53047-05,1
['L1'],MURATA10UH,R1210,1
['R14'],19.6K,R0603,1
['TP5', 'TP6'],PTR1PAD1-13Y,P1-13Y,2
['R11', 'R13'],10K,R0603,2
['U$6'],TSV912DFN8_2X2,DFN8_2X2,1
['HDR_PRGRM_NIET_PLAATSEN'],HEADER_1.27_6P,HEADER_1.27_6,1
['R10'],10k,R0603,1
['U$9'],LTC3525_BOOST,SC70-6,1
['C14', 'C15'],2.2uF,C0603,2
['U$4'],MCP4921-E/MS,SOP65P490X110-8N,1
['C4'],22uF,C0603,1
['R1', 'R2'],22K,R0603,2
['U2'],ATMEGA32L-8MU,QFN50P700X700X100-45N,1
['C2', 'C6', 'C7', 'C8', 'C11', 'C12', 'C16', 'C17'],100nF,C0603,8
['U1'],REG71055DDCT,SOT95P180X110-6N,1
['C13'],0.22uF,C0603,1
['R4'],483,R0603,1
['R3', 'R5', 'R7', 'R12'],100,R0603,4
['C5'],1uF,C0603,1
['TP1', 'TP2', 'TP3', 'TP4'],PTR1TP20R,TP20R,4
['C1'],1nF,C0603,1
['U$1'],WML-C20,WML-C20,1