2015-12-15 180 views
-1

我有一系列文本文件是书籍的页面。 (将其视为目录中的一系列文本文件)。每个文本文件都有几行文本。我的任务是搜索整个文本文件中的特殊字符,在这种情况下是'#'。跟踪文本文件是否有或没有特定符号

我想要一个程序来搜索整个页面,并记录这个页面是否有'#'或没有'#'。输出results应该是一个列出特定页面和是否存在'#'的列表。

​​

我的问题:我不知道如何跟踪哪个文件/页面有'#',哪个不是。

hashkeylist = [] 

for page in book: 
    for line in page: 
     for x in line: 
      if x == '#': 
       hashkeylist.append(x) 
      else: 
       pass 

results = [] 

for i in range(len(book)): # range of number of pages to label pages 
    if '#' in hashkeylist: 
     results.append('page %d yes' % (d)) 
    else: 
     results.append('page %d no' % (d)) 

很明显,这根本不起作用。

如何跟踪哪个页面有hashkey符号,哪个页面没有?

+0

你的'book'是一个列表,列表中有很多列表(这些列表中还有很多列表)吗? –

+0

@KevinGuan没有书。有几十个文本文件,每个文本文件都是一个文本块。 – ShanZhengYang

+0

@山正阳,你可以根据我的回答检查每个文件,你不需要在内存中存储任何行,并且一旦你找到了匹配,你应该短路,因为当你已经找到它时没有意义。 –

回答

0

首先,列出在file_list列表变量的所有文本文件,然后重复。以下只是一个示例代码。请尝试,如果它对你有帮助。

file_list = [] 
results = [] 
for filename in file_list: 
    with open(filename, "r") as fileobj: 
     if "#" in fileobj.read(): 
      results.append("%s Yes" % filename) 
     else: 
      results.append("%s No" % filename) 

for item in results: 
    print item 
0

而不是遍历每一行并搜索字符单个字母。当您打开文本文件,简单地做:

f.read().find('#') 

如果f是你的文件对象,它将返回-1如果符号是不是在文本中的任何地方发现的,否则将返回第一次出现的索引人物。

要跟踪的文件符号,你可以使用的代码行以上为条件,如果返回以外的任何其他-1添加当前打开的文件的名称,以供以后使用列表。

l = list() 
l.append(f.name) # name is a class variable for file objects that is preset 
0

所以,我认为这应该工作:

results = [] 

for num, page in enumerate(book, start=1): 
    if '#' in '\n'.join(page): 
     results.append('page{} yes'.format(num)) 
    else: 
     results.append('page{} no'.format(num)) 

因为你的代码看起来像page是一个列表,并有一些线在该列表中。如果page是字符串而不是列表,那么您不需要'\n'.join(page),而只需使用if '#' in page:

或者,一个行版本:

results = ['page{0} {1}'.format(num, 'yes' if '#' in '\n'.join(page) else 'no') for num, page in enumerate(book, start=1)] 
+0

条件块也可以用另一种方式简化。 'exists =('no','yes')',并且你可以通过'exists'中的'exists'获得相关的字符串,它可以直接传递给格式。 – Reti43

+0

@ Reti43:我知道并且尝试过,那并不清楚,只有7个字母。 –

1

可以把它看作一个目录的一系列文本文件)。每个文本文件有几行文字

这是微不足道的解决,在循环使用两个列表,一个用于做有符号和一个用于那些不这样做的文件,使用any每个文件,看是否有线包含将在比赛短路,没有必要读取或存储所有线路一次符号:

所有的
has, has_not = [],[] 
for fle in files: 
    with open(fle) as f: 
     if any("#" in line for line in f): 
       has.append(fle) 
     else: 
      has_not.append(fle) 
相关问题