在unix脚本中,存在以下代码:
grep -E 'value1' file1.txt | grep 'value2' | grep 'value3' | grep 'value3'
上面的命令将grepping file.txt中的所有变量,并根据结果在file1中写入“行”,否则将在file2中写入“行”
我想在Python中复制相同的功能。
我用变量的值创建了一个数组:
regexarr = ['value1', 'value2', 'value3', 'value4']
然后我以以下方式打开文件:
with open('file1.txt', 'r') as file1:
# then I have the below code to match the strings in the regexarr
if any(re.findall('|'.join(regexarr), file1.read())):
with open ('file2.txt', 'a+') as file2:
file2.write(eachline)
else:
with open('file3.txt', 'a+') as file3:
file3.write(eachline)
使用上面的代码,即使我有要写入到file3.txt的测试数据,也不会写入file3.txt
如何获得与python中的unix相同的功能?
答案 0 :(得分:1)
首先,您没有逐行遍历file1.txt
,所以我不知道您从哪里得到eachline
。其次,file1.read()
在检查时有效地读取了整个file1.txt
(与grep
不同的是,您不是逐行进行读取),因此任何后续的读取尝试都会返回一个空结果,包括如果您尝试将其内容写入另一个文件。最后,您的正则表达式将匹配链表/管道grep
中的任何值,而不是所有列出的值(第一个grep
过滤value1
上的行,第二个过滤器value2
上的行先前已过滤的行等)。
因此,请修复所有问题,这是模拟grep
的一种方法:
regexarr = ['value1', 'value2', 'value3']
with open('file1.txt', 'r') as f1, \
open('file2.txt', 'a+') as f2, \ # open file2.txt and file3.txt immediately
open('file3.txt', 'a+') as f3:
for line in f1: # iterate over file1.txt contents line by line
if all(re.search(r, line) for r in regexarr):
f2.write(line) # write only the matching lines to file2.txt
else:
f3.write(line) # write non-matching lines to file3.txt