python - 检查来自 zip 的对是否正确?
问题描述
我需要你对这个问题的建议。
我已经在这两个列表中收集了我需要的内容:simpl2
, astik
, 使用以下代码:
simpl2 = []
astik = []
for path, subdirs, files in os.walk(rootfolder):
for name in files:
if 'sim2.shp' == name:
simpl2.append(os.path.join(path, name))
elif 'ASTIK.shp' == name:
astik.append(os.path.join(path, name))
上面的代码在包含文件夹的根文件夹中搜索:v1.v2,v3,v4
所以使用这个:
for i,j in zip(simpl2,astik):
print(i,j)
给出了这个:
内容
C:\Users\user\Desktop\pl\v1\exported\sim2.shp C:\Users\user\Desktop\pl\v1\ASTIK\ASTIK.shp
C:\Users\user\Desktop\pl\v2\exported\sim2.shp C:\Users\user\Desktop\pl\v4\ASTIK\ASTIK.shp
问题
如何确保这些对来自同一个文件夹(比如第一行既来自v1
又不是来自的第一行(比如第二行一个来自v2
,另一个来自v4
)使它们根本没有一对。
这应该会发生,因为它们将在以后使用并且它们必须是正确的对,否则我已经准备好代码,但对于那些没有对的代码,问题是如何修复前面描述的这部分。
解释
根文件夹是:
C:\Users\user\Desktop\pl
之后pl
有一个 v1,v2,v3,v4 文件夹。这些文件夹中的每一个都有一些与所有 4 个文件夹相同的文件。唯一的区别是有些是空的。我只想检查是否v
在列表中创建了正确的相同对。
解决方案
好的,看到你的更新可能你对这样的东西更感兴趣:
import os
simpl2 = []
astik = []
rootfolder = r'C:\Users\user\Desktop\pl'
subfolders = [os.path.join(rootfolder, i) for i in ['v1','v2','v3','v4']]
for folder in subfolders:
temp = {name: os.path.join(path, name)
for path, subdirs, files in os.walk(folder)
for name in files
if name in ['sim2.shp', 'ASTIK.shp']}
if len(temp) == 2:
simpl2.append(temp['sim2.shp'])
astik.append(temp['ASTIK.shp'])
旧代码
但是...如果这是您的最终目标,您也可以只存储路径。如果两个文件都在路径中,那么您知道路径包含这两个文件。然后,您可以在需要时使用 os.path.join() 轻松构建结束路径。
paths = []
for path, subdirs, files in os.walk(rootfolder):
if ('sim2.shp' in files) and ('ASTIK.shp' in files):
paths.append(path)
或者更紧凑的格式:
lookfor = ['sim2.shp','ASTIK.shp']
paths = [p for p,s,f in os.walk(rootfolder) if all(i in f for i in lookfor)]
推荐阅读
- php - 根据查询字符串创建新登录
- swift - 多条件快速排序
- php - 为什么moodle说无法将缓存配置保存到文件
- python - 读取包含日语句子的文本文件
- azure-devops - Azure 虚拟规模集和 MS 托管代理
- apache-spark - 故障转移后如何配置 alb 以指向新的主实例(EMR)
- ios - 此版本的 Realm 不支持打开格式版本 22 的 Realm 文件
- sentry - 我在哪里可以找到 webpack-sentry-plugin 上传的 sourceMap 文件
- azure-functions - Oryx - 找不到框架“Microsoft.NETCore.App”,版本“3.1.0”
- android - RecyclerView 中的 AdjustResize 未按预期工作,自 API 30 (targetSdkVersion 30) 以来将 EditText 隐藏在键盘下方