Python如何多次遍历文件及查找特定文件

Python 2.7
IDE Pycharm 5.0.3
刚学到文件流的操作,这个和Linux是一样的,所以比较好上手,难怪Python是运维的好助手啊,每天一点小知识。。。。

首先来一个遍历小助手,刚开始读文件的时候,每次只能读完一次,而且用while 来写循环也出错,网上爬了下,找到seek()方法:
fileObject.seek(offset[, whence])
目前只需要知道offset是偏移量,也就是文件的读/写指针位置

with open('/Users/MrLevo/Desktop/Python_test.txt') as f:
    for line in f:
        print line
    print '-------------------'
    for line in f:
        print line

这里的“———–”是为了显示能否再次遍历文件,答案是否定的。效果如图;

this is write line 4

this is write line 5

this is write line 6 -------------------

而这不是我的目的,我需要在下划线之后再次遍历文件,所以采用seek()方法,偏移值为默认0

with open('/Users/MrLevo/Desktop/Python_test.txt','r') as f:
    for line in f:
        print line
    print '-------------------'
    f.seek(0)
    for line in f:
        print line

显示效果:

this is write line 4

this is write line 5

this is write line 6
-------------------
this is write line 4

this is write line 5

this is write line 6

这就是我们需要的效果啦,很简单吧;如果还是不够清楚,请看命令行形式的代码:

In[4]: f = open('/Users/MrLevo/Desktop/Python_test.txt','r')
In[5]: f.readline()
Out[5]: 'this is write line 4\n'
In[6]: f.readline()
Out[6]: 'this is write line 5\n'
In[7]: f.seek(0)
In[8]: f.readline()
Out[8]: 'this is write line 4\n'
In[9]: f.seek(1)#偏移1,没了t
In[10]: f.readline()
Out[10]: 'his is write line 4\n'
In[11]: f.readline()
Out[11]: 'this is write line 5\n'
In[12]: f.seek(2)#偏移2,没了th
In[13]: f.readline()
Out[13]: 'is is write line 4\n'

再不清楚,请单击右键Python,选择卸载,点击确定;

接下来就是查找关键字文件了,自己定义了弱查询和强查询,一个相当于只要包含关键字就找出相关文件,另一个是完全指定一个名字,只有完全匹配才输出:
先来弱查询;

import os
def search(keyword,dir):
    for x in os.listdir(dir):
        if os.path.isfile(x):
            if keyword in os.path.split(x)[1]:
                absdir_name = os.path.abspath(dir)
                file_name = os.path.split(x)[1]
                print os.path.join(absdir_name,file_name)

        if os.path.isdir(x):
            search(keyword,x)

while True:
    keyword = raw_input('请输出需要查找的关键字:')
    if keyword =='q':
        break
    dir = raw_input('请输入需要检索的路径:')

    search(keyword,dir)

最后使用了while连续查询,毕竟检索这种事,要用很多次对不对。不想检索了,输入q进行退出,因为采用了raw_input函数,所以输入的自动被认为是字符串,请不要加””这个;

请输出需要查找的关键字:test
请输入需要检索的路径:.
C:\Users\MrLevo\PycharmProjects\test\pandas_test.py
C:\Users\MrLevo\PycharmProjects\test\test_test.py
C:\Users\MrLevo\PycharmProjects\test\test_test2.py
请输出需要查找的关键字:mm
请输入需要检索的路径:.
C:\Users\MrLevo\PycharmProjects\test\downlaod_mm.py
请输出需要查找的关键字:q

Process finished with exit code 0

而强匹配则只需要把in改成==就可以啦:

if keyword == os.path.split(x)[1]:#查看是否属于该成员

至此,一个比较完整的文件检索小程序就完事了,以后用空做个gui出来,方便检索文件。

这里还有要注意的是in的方法,一般我比较无脑,直接看了例子觉得这样就是这样,而并不是去考究为什么,但今天碰到个问题;

s = ['a','abc','123','efg']

print '直接匹配:','ab' in s
for i in s:
    if 'ab' in i:
        print 'for后匹配:','succeed'
直接匹配: False
for后匹配: succeed

两个答案是不一致的,我傻傻的以为,in方法神奇在于能够模糊匹配,实质上,in并不是模糊匹配,当然在一个字符串的列表中,再来看下面一个例子:

q = ['abc']
print 'ab' in q
print 'abc'in q
t = ('abc')
print 'ab' in t
f = 'abc'
print 'ab' in f
False
True
True
True

这就可以理解for的作用了,将列表中元素拆分为字符串,然后一个个比较,就像上述的例子一样。
再来看一个例子,有助于加深印象:

p = [['abc'],'a','123','efg']
print '[\'abc\']列表直接匹配:',['abc'] in p
print '\'abc\'字符串直接匹配:','abc'in p
for i in p:
    if 'ab' in i:
        print '\'ab\'匹配:','succeed'
    if 'abc'in i:
        print '\'abc\'for后匹配:','succeed'
    print type(i)
['abc']列表直接匹配: True
'abc'字符串直接匹配: False
'abc'for后匹配: succeed
<type 'list'>
<type 'str'>
<type 'str'>
<type 'str'>

虽然for后出来是个list,但是,list用于完全匹配字符串也是可行的,具体看上面,只是弱匹配没有元组和字符串来的好。
至此,相信以后自己应该不会再弄错啦。

你可能感兴趣的:(python,遍历,匹配,特定查找)