0

我需要从看起来像这样的文件名中拆分出文本:'foo_bar_1_10.asc.gz'并且我为每个看起来像这样的文件都有一个相应的文本列表:'1 10'. 这个对应的列表是我想要重新创建的。原因是我需要将所有文件与主列表进行比较以查找丢失的文件。所以最终我需要一种方法来比较两个列表(差异?)任何帮助都会很棒

import os
newtxt = []
oldtxt = '\foobar\master_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 102: 1 12。我需要检查newtxtfrom中的缺失值oldtxt。我试过了这:

s = set(nl(newtxt))
diff = [x for x in nl(oldtxt) if x not in s]
print diff

这返回的是一些文本字符,而不是我所期望的。有什么帮助吗?

4

5 回答 5

2

听起来您正在为字符串解析部分苦苦挣扎。.split首先通过调用string方法将文件名分割成几段,用句号分割:

>>> 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'
于 2012-09-26T20:40:05.940 回答
0

一些评论(以及您自己想出来的解决方案的路径):

  • 确保你逃脱了\in \foobar,因为\f不会给你你所期望的
  • .replace方法使用2 个参数:你要替换什么,你要用什么来替换它。你错过了一个。
  • 如果您知道如何替换foo_bar_, by 比如说 '',您可以对扩展名做同样的事情,然后将 a 替换_' '...
于 2012-09-26T20:39:12.470 回答
0

我想正则表达式会是最简单的。当你想保持空格时,用空格替换每个非数字字符,然后去掉前导和尾随空格

>>> import re
>>> a = 'foo_bar_1_10.asc.gz'
>>> re.sub('[^\d]',' ',a).strip()
'1 10'
于 2012-09-26T20:39:20.113 回答
0

比方说

s = '1_10.asc.gz'

然后

l = s.split('.')[0].split('_')
#注意 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

于 2012-09-26T20:39:25.353 回答
0

这是另一个使用正则表达式解析列表中所有文件的解决方案。

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")
于 2012-09-26T21:07:37.863 回答