2013-05-17 28 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()

声明:此代码未经测试