【问题标题】:Counting "something" in multiple text files in one folder在一个文件夹中的多个文本文件中计算“某物”
【发布时间】:2011-11-02 00:27:37
【问题描述】:

我正在尝试计算文件中出现“Tmp”的次数以及该计数属于哪个文件。我创建了一个有效的脚本,但我必须为每个文件设置输入文件和输出目录。为了改进它,我希望脚本在设置一次后遍历文件夹中的每个文件。

我一直在尝试:

import tkFileDialog
import glob
import os
directory = tkFileDialog.askdirectory()
for infile in glob.glob(os.path.join(directory, "*.*")):
    open(infile, "r").read()
    infile.count("Tmp")

目前我正在计算“Tmp”在文件名中出现的次数,而不是在我键入时出现在实际文件中的次数:

print infile

它输出文本文件的内容而不是目录?我只是对去哪里或做什么感到困惑。

【问题讨论】:

  • import tkFileDialog.askdirectory() - 不,只是没有。
  • import tkFileDialog.askdirectory() 是的,这是一个错字应该是 import tkFileDialog
  • 这是无效代码,您的示例不应编译和运行。您不能在执行时只导入带有括号的内容。
  • 我是 python 新手,但我想你是在指出我是如何忘记“import os”部分的?
  • 我要指出这一点:import tkFileDialog.askdirectory() 你已经更正了

标签: python file text count


【解决方案1】:

我会使用 os.walk 而不是 glob:

import tkFileDialog
import os
import os.path
import re

directory = tkFileDialog.askdirectory()

for dirpath, dirnames, filenames in os.walk(directory):
    for filename in filenames:
        path = os.path.join(dirpath, filename)

        with open(path) as file:
            contents = file.read()

            print path[:30], contents.count('Tmp'), re.findall('Tmp\d{5}', contents)

【讨论】:

  • @Jeff 我很想知道什么不起作用。你有错误吗?会发生什么?
  • 嗯,它今天对我有用,我一定是昨晚打错了什么。我能够操纵 Cesars 来压缩文件名,从 90+ 到前 30 个字符,我怎么能对这段代码做同样的事情,如果可能的话,列出每个文件中的所有“Tmp12345”。我的原始脚本使用 re.findall('[Tmp]+\d(5)',infile) 来执行此操作。这可能有点超出我的想象。
  • 我更改了代码来满足您的需求。请记住,如果你在 *nix 系统上,grep 可以做你需要的一切(如果你只需要打印这些东西)。
  • 感谢您的帮助,我将搞砸这个,看看我是否能完全掌握这里的过程,总而言之,这 7 行替换了我最初开始的 20 行。这里没有 nix 系统,我一直在使用 print >> 将所有内容强制写入文本文件。感谢您的帮助!
【解决方案2】:

应该是:

data = open(infile, 'r').read()
print data.count('Tmp')

【讨论】:

  • 这样做的问题是无法关闭infile,如果目录中有数千个文件,这将是一个问题。
  • 这适用于计算“Tmp”的每个实例,这是我可以使用的。谢谢
  • 没问题。祝你好运。
【解决方案3】:
import os
import glob
import tkFileDialog


directory = tkFileDialog.askdirectory()        

for infile in glob.glob(os.path.join(directory, '*')):
    if os.path.isfile(infile):
        f = open(infile)
        print os.path.split(infile)[-1], f.read().count('Tmp')

【讨论】:

  • 你必须先打开infile才能阅读,我想你的意思是infile.read().count('Tmp')
  • 应该是count('Tmp'),而不是count(directory)。
  • 我一直在使用这种方法并且一直有效,我发现我不是唯一一个有错别字的人:)
猜你喜欢
  • 1970-01-01
  • 2021-06-01
  • 2019-01-06
  • 2019-06-18
  • 2022-12-21
  • 2022-01-02
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多