2015-12-15 182 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) 
相關問題