我需要从文件名中拆分文本,如下所示:'foo_bar_1_10.asc.gz'
,我为每个文件都有一个相应的文本列表,如下所示:'1 10'
. 这个相应的列表是我想重新创建的。 原因是我需要将所有文件与主列表进行比较以查找丢失的文件。 所以最终我需要一种方法来比较两个列表(diff? 任何帮助都会很棒
import os
newtxt = []
oldtxt = 'foobarmaster_list.txt'
wd = 'foobar'
for file in os.listdir(wd):
file = file.split('.')
subpieces = file[0].split('_')
numbers = ' '.join(subpieces[-2:])
newtxt.append(numbers)
print txt
@@@更新 @@@我现在有 2 个带有行号的列表(使用类似于 unix 中的 nl 的函数 - 名为 nl
和输出看起来像这样 1: 1 10
和2: 1 12
。 我需要检查oldtxt
newtxt
中的缺失值。 我试过这个:
s = set(nl(newtxt))
diff = [x for x in nl(oldtxt) if x not in s]
print diff
这返回的是一些文本字符,而不是我预期的。 有什么帮助吗?
听起来您正在为字符串解析部分而苦苦挣扎。首先通过调用字符串.split
方法将文件名拆分为多个部分,按句点拆分:
>>> file = 'foo_bar_1_10.asc.gz'
>>> pieces = file.split('.')
>>> pieces
['foo_bar_1_10', 'asc', 'gz']
然后根据 _ 字符将其拆分为子部分:
>>> subpieces = pieces[0].split('_')
>>> subpieces
['foo', 'bar', '1', '10']
然后,您可以将最后两个部分重新连接在一起,用空格分隔,如下所示:
>>> numbers = ' '.join(subpieces[-2:])
>>> numbers
'1 10'
一些评论(以及通往解决方案的途径,您会觉得自己想出了很多):
- 确保你逃脱了
foobar
,因为
f
不会给你你所期望的 .replace
方法使用 2 个参数:要替换的内容,要替换的内容。你错过了一个。- 如果你知道如何替换
foo_bar_
,比如说,'',你可以对扩展做同样的事情,并将_
替换为,比如说,一个' '
......
我想正则表达式会是最简单的。由于您要保留空格,因此将每个非数字字符替换为空格,然后去除前导空格和尾随空格
>>> import re
>>> a = 'foo_bar_1_10.asc.gz'
>>> re.sub('[^d]',' ',a).strip()
'1 10'
假设
s = '1_10.asc.gz'
然后
l = s.split('.')[0].分裂('_')
#Note l = ['1','10']
如果您需要"1 10",则执行
项目 = ' '.join(l)
要执行"差异",请使用集合差异(用法取决于您运行的 python 版本)。看
http://docs.python.org/library/stdtypes.html#set或者如果 python2.4 及更低版本:http://docs.python.org/library/sets.html
这是另一种使用正则表达式解析列表中所有文件的解决方案。
import os
import re
reg1 = re.compile("d+_d+")
newtxt = []
wd = 'foobar'
for file in os.listdir(wd)
match = reg1.search(file)
if match:
newtxt.append(match.group().replace('_', ' '))
print file
else:
print("no match found")