2013-05-17 66 views
0

它不是一個合適的代碼,但我想知道是否有一種方法來搜索w./o使用.split(),因爲它形成一個列表,我不用想,隨着這個片段:Python:每行讀取一個文本文件

f=(i for i in fin.xreadlines()) 
for i in f: 
    try: 
     match=re.search(r"([A-Z]+\b) | ([A-Z\'w]+\b) | (\b[A-Z]+\b) | (\b[A-Z\'w]+\b) | (.\w+\b)", i) # | r"[A-Z\'w]+\b" | r"\b[A-Z]+\b" | r"\b[A-Z\'w]+\b" | r".\w+\b" 

也可以使一個可重用的類模塊,這樣

class LineReader: #Intended only to be used with for loop 
    def __init__(self,filename): 
     self.fin=open(filename,'r') 
    def __getitem__(self,index): 
     line=self.fin.xreadline() 
     return line.split() 

說f其中= LineReader(文件路徑)

和我在F。 getitem(index =行號25)循環從那裏開始? 我不知道該怎麼做。一些提示?

+0

你想要什麼而不是一個列表?發電機?每次調用函數都會返回一個新單詞的函數? – Lennart

+0

輸出應該是例如每行:word1 word2 word3 ..只是一個o/p字符串 – user2290820

+0

@Lennart可以說一個簡單的文本文件被搜索特定pattern.only每行打印1 o/p。並且可以通過上面給出的類來完成嗎? – user2290820

回答

1

取得一行的第一個單詞:

line[:max(line.find(' '), 0) or None] 

line.find(' ')搜索第一個空格,並將其返回。如果沒有找到空白,則返回-1

max(...), 0)確保結果始終大於0,並使-1爲0.由於bool(-1)爲True且bool(0)爲False,因此這是有用的。

x or None如果計算結果爲X X = 0,否則,無

和finaly line[:None]等於line[:],它返回到line

首先樣品的字符串相同:

with open('file') as f: 
    for line in f: 
     word = line[:max(line.find(' '), 0) or None] 
     if condition(word): 
      do_something(word) 

而類(在此實施爲發生器)

def words(stream): 
    for line in stream: 
     yield line[:max(line.find(' '), 0) or None] 

,你可以使用像

gen = words(f) 
for word in gen: 
    if condition(word): 
     print word 

或者

gen = words(f) 
while 1: 
    try: 
     word = gen.next() 
     if condition(word): 
      print word 
    except StopIteration: 
     break # we reached the end 

但你也想從某個特定行號閱讀。如果您不知道線條的長度,則無法做到非常高效。唯一的辦法是讀線並丟棄它們,直到你到達合適的牀單。

def words(stream, start=-1): # you could replace the -1 with 0 and remove the +1 
    for i in range(start+1): # it depend on whether you start counting with 0 or 1 
     try: 
      stream.next() 
     except StopIteration: 
      break 
    for line in stream: 
     yield line[:max(line.find(' '), 0) or None] 

請注意,如果某行以空格開頭,可能會得到奇怪的結果。爲了防止這種情況,您可以在循環的開頭插入line = line.rstrip()

聲明:此代碼未經測試