Python 如何搜索文件、计算点击数并将数字写入.csv中的B列?

Python 如何搜索文件、计算点击数并将数字写入.csv中的B列?,python,search,csv,count,Python,Search,Csv,Count,这是我的剧本。它当前查找路径中包含*cycle*.log的所有文件,然后查找这些文件中包含“timeout of”的所有行,并将它们传递到outfilecamera以及找到它的文件的名称中 i = 0 ii = "\n" for i in range(0,listlength): path = pathlist[i].strip() outfilecamera = join((path), 'cameratimeouts.txt') os.chdir(path)

这是我的剧本。它当前查找路径中包含*cycle*.log的所有文件,然后查找这些文件中包含“timeout of”的所有行,并将它们传递到outfilecamera以及找到它的文件的名称中

i = 0

ii = "\n"

for i in range(0,listlength):
    path = pathlist[i].strip()
    outfilecamera = join((path), 'cameratimeouts.txt')   
    os.chdir(path)
    for path in glob.glob("*cycle*.log"):
        with open(path) as f_in, open(outfilecamera, 'a') as f_out:
            f_out.writelines(path)
            f_out.writelines(ii)
            f_out.writelines(line for line in f_in if "timeout of" in line)
我还想做的是计算在文件中找到命中的次数,并将该数字粘贴到csv文件的B列中。即,每行将是每个文件中的点击数。A列理想情况下等于i

我已经搜索了很多年,但找不到计数函数


我感谢我们的帮助

这是您需要的

import csv
import glob

searched = 'timeout of'
with open('output.csv', 'wb') as csvfile:
    cwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    cwriter.writerow(['File', 'Number'])
    for path in glob.glob("*cycle*.log"):
        with open(path) as f_in:
            n = 0
            for line in f_in.readlines():
                if searched in line:
                    n += 1
            cwriter.writerow([path, n])

格雷普呢?这项任务将非常简单

grep -c 'timeout of' *cycle*.log
对于类似csv的输出,您需要将冒号替换为逗号:

grep -c 'timeout of' *cycle*.log | sed 's/:/,/'
并将结果放入cameratimeouts.txt文件:

grep -c 'timeout of' *cycle*.log | sed 's/:/,/' >cameratimeouts.txt
如果您坚持使用python,我的解决方案是:

for i in range(0,listlength):
    path = pathlist[i].strip()
    outfilecamera = join((path), 'cameratimeouts.txt')   
    os.chdir(path)
    for path in glob.glob("*cycle*.log"):
        with open(path) as f_in, open(outfilecamera, 'a') as f_out:
            f_out.write('%s,%d\n' % (path, sum(l.count('timeout of') for l in f_in)))

在此处隐藏其找到的次数:

f_out.writelines(line for line in f_in if "timeout of" in line)
因此,您所要做的就是首先消耗生成器,比如说进入一个列表:

matched_lines = list(line for line in f_in if "timeout of" in line)
f_out.writelines(matched_lines)
接下来,只需收集每个文件的匹配数。在循环顶部创建空白列表,然后在循环内部添加文件名和计数:

file_counts = []

# .. your loop starts

    matched_lines = list(line for line in f_in if "timeout of" in line)
    f_out.writelines(matched_lines)
    file_counts.append((os.path.basename(path),len(matched_lines)))
处理完文件后:

with open('results.csv','w') as f:
    writer = csv.writer(f, delimiter=",")
    writer.writerow(['File Name','Count'])
    writer.writerows(file_counts)