如何根据 python 中的内容打印文件名
How to print the filename with respect to content inside in python
我有 2 个文件 a.txt
和 b.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() 一次读取它们并将条件应用于指定行。
我稍微更改逻辑的原因是使用难以理解的硬编码条件是一种不好的做法。此外,这些真的很容易受到任何更改的影响,如果发生任何事情,都需要进行大量修改。
我有 2 个文件 a.txt
和 b.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() 一次读取它们并将条件应用于指定行。
我稍微更改逻辑的原因是使用难以理解的硬编码条件是一种不好的做法。此外,这些真的很容易受到任何更改的影响,如果发生任何事情,都需要进行大量修改。