在Python中按特定字符串/部分字符串拆分列表对象
基本上,我必须制作一个脚本来做一些事情,其中一部分是我必须访问一个包含我需要的各种数据的文件,更具体地说是链接和名称,问题是该文件没有真正特定的格式。 文件: 这或多或少是文件遵循的格式,当然,名称中自然有更多的单词,“更多文本”部分通常是描述。要读取文件,我只需执行以下操作:在Python中按特定字符串/部分字符串拆分列表对象,python,string,list,Python,String,List,基本上,我必须制作一个脚本来做一些事情,其中一部分是我必须访问一个包含我需要的各种数据的文件,更具体地说是链接和名称,问题是该文件没有真正特定的格式。 文件: 这或多或少是文件遵循的格式,当然,名称中自然有更多的单词,“更多文本”部分通常是描述。要读取文件,我只需执行以下操作: ssh.exec_command("gen list command") cat_stdin, cat_stdout, cat_stderr = ssh.exec_co
ssh.exec_command("gen list command")
cat_stdin, cat_stdout, cat_stderr = ssh.exec_command("cat listpath")
cat_output = cat_stdout.readlines()
for line in cat_output:
line_split = line.splitlines()
从这里我得到了列表对象形式的整行
[Package For IoT - 0.0.4 - 279 - https://package-server.something.eu-central-1.host.com/production/package_manager/
device/tlt_custom_pkg_package_iot_0.0.4_morestuff.extention - More text - tlt_custom_pkg_package_iot
- 0.0.4]
现在的问题是:如何使用列表对象来拆分它?由于每个包的字数不同,我不能使用空格或“-”进行拆分,不会更改的是服务器地址(至少现在不会更改,以后可能会更改),因此安全的选择是使用“https”部分拆分链接(我需要它,所以应该存储在变量中),然后使用“tlt\u自定义”名称的一部分(我也需要它),因为这个特定的词也保持不变,那么我可以进一步处理这个部分,并使其适应进一步的使用。但是,是的,这就是我挣扎的地方,因为我最近刚开始使用python,我被困在这一部分。
我尝试的是:
for line in cat_output:
line_split = line.splitlines()
split_list = ["https", "tlt"]
temp = zip(chain([0], line_split), chain(line_split, [None]))
res = list(split_list[i] for i in temp)
print(str(res))
这会导致错误:列表索引必须是整数或切片,而不是元组
我还想从这里尝试解决方案:
但我不明白如何为自己调整这些解决方案
TL;DR我想从对象列表中获取完整链接和tlt_自定义字符串,但我不知道如何实现
更新
我尝试了几件我认为我得到了我需要的东西:
ssh.exec_command("command")
cat_stdin, cat_stdout, cat_stderr = ssh.exec_command("cat filepath")
cat_output = cat_stdout.readlines()
for line in cat_output:
line_split = line.splitlines()
temp = [i.split('https:')[1] for i in line_split]
package_info = "https:"+str(temp[0])
temp = package_info.split('.ipk')[0]
package_link = str(temp)+".ipk"
temp = package_info.split('tlt_')[2]
package_name = "tlt_"+str(temp)
print(package_link)
print(package_name)
这样我得到了链接和名称,理论上它应该可以工作,但我觉得这有点复杂,因为我正在删除和添加部分字符串。有更好的解决方法吗?嗯,如果我读对了,这里的实际分隔符是
'-'
。因此,你应该在这一点上分道扬镳:
ssh.exec_command("command")
cat_stdin, cat_stdout, cat_stderr = ssh.exec_command("cat filepath")
sep = ' - ' # DRY principle: write it once, use it many times
for line in cat_stdout:
line_split = line.strip().split(sep)
package_link = line_split[3]
# joining last 2 fields will allow possible - chars in "More text"
package_name = sep.join(line_split[-2:])
print(package_link)
print(package_name)
您甚至可以直接创建一个包含理解力的dict列表:
...
sep = ' - '
data = [{'link': line_split[3], 'name': sep.join(line_split[-2:])}
for line in cat_out
for line_split in (line.strip().split(sep),)]
temp
的每个元素都是一个元组
,您使用tuple
作为列表索引
,但是列表索引
必须是一个整数
。我得到:在尝试第一个选项时,“内置函数”或“方法”对象不可下标,我必须为它添加一些东西才能工作,还是它根本就不应该发生?@Wowy:我的错。输入错误:line.split[-2]
而不是line\u split[-2]
。我知道应该避免手动复制代码,但我有时会这样做……您能解释一下这个行分割[-2:]
部分的作用吗?我特别不确定:
@Wowy:这是从最后一个元素之前的元素开始的切片(所以是在最后一个和最后一个之前)。这包含了关于切片的详细解释
...
sep = ' - '
data = [{'link': line_split[3], 'name': sep.join(line_split[-2:])}
for line in cat_out
for line_split in (line.strip().split(sep),)]