我想要实现的更大范围是。我有一个Windows directory
,其中可以包含可变数量的.csv
个文件。这些文件是作为PLC的测试结果生成的。它们通过文件名来区分。测试的每个周期都会生成2个.csv
文件。第一个文件名包含订单号,-
分隔符和字符串UP
。第二个文件是相同的,除了字符串用DOWN
代替。
示例文件名:
1234567890-UP
或1234567890-DOWN
目录示例:
1234567890-UP.csv
1234567890-DOWN.csv
2000005001-UP.csv
2000005001-DOWN.csv
我正在尝试编写一个脚本,该脚本循环遍历目录中的所有文件名并将它们存储在列表中。然后从元素中删除除订单号以外的所有内容。然后删除重复的元素。使用上面的示例目录,我将得到一个看起来像[1234567890,2000005001]
的列表。我已经完成了很多。
现在,我要尝试的是遍历原始文件名列表,并将它们与我的新列表进行比较,以创建一个嵌套列表,该嵌套列表根据文件的顺序号将文件分开。使用相同的示例目录,列表如下所示:[[1234567890-UP.csv,1234567890-DOWN.csv],[2000005001-UP.csv,2000005001-DOWN.csv]]
最后,我想遍历此列表,并根据列表索引将.csv
文件合并在一起。
也许有一种更容易被我忽略的方法,这将为我省去很多麻烦。
我当前使用嵌套的for循环填充嵌套列表的代码如下
nestedlist=[]
for x in range(len(filenamelist)):
for y in range(len(filteredlist)):
if filteredlist[y] in filenamelist[x]:
nestedlist[y].append(filenamelist[x]
这将返回错误Index out of range
。这是因为从未定义nestedlist
的大小。我不确定如何做到这一点,或者最好的方法是什么?
答案 0 :(得分:1)
这可以通过简单得多的方式来实现。假设目录的文件列表为-
files = [1234567890-UP.csv,1234567890-DOWN.csv,2000005001-UP.csv,2000005001-DOWN.csv]
您可以对此进行迭代,创建订单号到实际文件名的映射。
filemap = {}
for file in files:
order_number = re.compile('(\d*)-(\w*).csv').match(file).groups()[0]
print(order_number)
files = filemap.get(order_number, [])
files.append(file)
filemap[order_number] = files
那应该给出这样的东西。
{'1234567890': ['1234567890-UP.csv', '1234567890-DOWN.csv'],
'2000005001': ['2000005001-UP.csv', '2000005001-DOWN.csv']}
现在您可以查找订单号并在需要时合并
答案 1 :(得分:0)
您应直接附加到nestedlist
,而不要附加到nestedlist[y]
。空列表中没有索引y
。
您也可以简化这种方式; range
是不必要的,因为您可以直接遍历列表:
nestedlist=[]
for x in filenamelist:
for y in filteredlist:
if y in x:
nestedlist.append(x)