Python如何多次遍历文件及查找特定文件
Python 2.7IDE Pycharm 5.0.3刚学到文件流的操作,这个和Linux是一样的,所以比较好上手,难怪Python是运维的好助手啊,每天一点小知识。。。。首先来一个遍历小助手,刚开始读文件的时候,每次只能读完一次,而且用while 来写循环也出错,网上爬了下,找到seek()方法:fileObject.seek(offset[, whence])
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用于完全匹配字符串也是可行的,具体看上面,只是弱匹配没有元组和字符串来的好。
至此,相信以后自己应该不会再弄错啦。
更多推荐
所有评论(0)