如何根据 python 中的内容打印文件名

How to print the filename with respect to content inside in python

我有 2 个文件 a.txtb.txt

a.txt 包含带有 2 个空行的文本 "T Mobile rider"。 b.txt 包含 2 个空行,后跟文本 "Iphone"。

代码

import os
for (dirname,dirs,files) in os.walk('.'):
for filename in files:
    if filename.endswith('.txt'):
        thefile = os.path.join(dirname,filename)
        size =  (os.path.getsize(thefile),thefile)
        if size[0] == 22 or size[0] == 23:
            print ('T-Mobile:',thefile)
            continue
        fhand = open(thefile,'r')
        lines = list()
        for line in fhand:
            lines.append(line)
            #print (lines)
        fhand.close()
        if len(lines) == 3 and lines[2].startswith('Iphone'):
            print ('iPhone:', thefile)
            continue

我的输出

T-Mobile: .\Captures\a.txt
T-Mobile: .\Captures\b.txt

期望的输出

T-Mobile: .\Captures\a.txt
iPhone: .\Captures\b.txt   

我按照以下逻辑打印了文件名:

  • iPhone: FILENAME 如果文件在任何行中包含 Iphone
  • T-Mobile: FILENAME 如果文件在任何行中包含 T Mobile

文件夹结构:

├── Captures
│   ├── a.txt
│   └── b.txt
└── code.py

代码:

import os
for dirname, dirs, files in os.walk('.'):
    for filename in files:
        if filename.endswith('.txt'):
            thefile = os.path.join(dirname, filename)
            with open(thefile) as f:
                lines = f.readlines()
                if any('Iphone' in line for line in lines):
                    print('iPhone:', thefile)
                if any('T Mobile' in line for line in lines):
                    print('T-Mobile:', thefile)

输出:

T-Mobile: ./Captures/a.txt
iPhone: ./Captures/b.txt

我想我在我的电脑上重新创建了你的案例并找到了一种你可能想要的解决方案:

import os
import re

for (dirname, dirs, files) in os.walk('.'):
    for filename in files:
        if filename.endswith('.txt'):
            thefile = os.path.join(dirname, filename)
            with open(thefile, 'r') as fhand:  # open the file using with formula is preferred
                # this block is for classifying the files
                for line in fhand:
                    if re.match('t[ .-]?mobile', line.lower()):
                        print('T-Mobile: ', thefile)
                        break
                    elif re.match('iphone', line.lower()):
                        print('iPhone: ', thefile)
                        break

请注意,我使用 re module 更改了文件分类方式。通过您提供的示例,我相信这些实际上会更好。在这里,我打开找到的每个“.txt”文件并逐行阅读,试图找到告诉它属于哪个组的模式(这里只有两个 - T-Mobile 和 iPhone,但也许你会喜欢定义更多)。文件只能归为一组,因此一旦找到满足条件的行,文件将关闭并打印相应的消息。


我提供的条件远没有您的严格,因此它们可能无法涵盖所有​​内容,从而产生假阳性结果。例如,如果您有一些文件以 "Iphone" 开头的第一行,它将被分类到 iPhone 组。如果出于某种原因你只想匹配这些在第三行有这个词的文件,那么在负责对文件进行分类而不是遍历行的块中你可以使用 fhand.readlines() 一次读取它们并将条件应用于指定行。

我稍微更改逻辑的原因是使用难以理解的硬编码条件是一种不好的做法。此外,这些真的很容易受到任何更改的影响,如果发生任何事情,都需要进行大量修改。