Вопрос:

Как напечатать имя файла относительно содержимого внутри в Python

python file file-io os.walk

22 просмотра

2 ответа

170 Репутация автора

У меня есть 2 файла a.txtиb.txt

a.txtсодержит текст «T Mobile Rider» с 2 пустыми строками. 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   
Автор: Mous Источник Размещён: 11.08.2019 07:00

Ответы (2)


0 плюса

5035 Репутация автора

Я напечатал имя файла в следующей логике:

  • 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
Автор: arsho Размещён: 11.08.2019 07:41

0 плюса

46 Репутация автора

Я думаю , что я воссоздал свой случай на моем компьютере и нашел своего рода решение , которое вы могли бы хотеть:

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 . С примером, который вы привели, я считаю, что на самом деле это будет лучше. Здесь я открываю каждый найденный файл '.txt' и читаю его построчно, пытаясь найти шаблоны, указывающие, к какой группе он принадлежит (здесь только два - T-Mobile и iPhone, но, возможно, вы хотели бы определить больше) , Файл можно классифицировать только как одну группу, поэтому, как только найдена строка, соответствующая условию, файл закрывается и печатается соответствующее сообщение.


Условия, которые я предоставил, являются менее строгими, чем ваши, поэтому они могут не охватывать все, что приводит к ложноположительным результатам. Например, если у вас есть файл, который начинает первую строку с «Iphone», он будет классифицирован как группа iPhone. Если по какой-то причине вы хотите сопоставить только те файлы, которые содержат это слово в третьей строке, то в блоке, который отвечает за классификацию файлов, вместо перебора строк, вы можете прочитать их все сразу, используя fhand.readlines () и применив условия к указанной строке.

Причина, по которой я немного изменил логику, заключается в том, что использовать жестко закодированные условия, которые трудно понять, - плохая практика. Более того, они действительно уязвимы для любых изменений и нуждаются в большом количестве модификаций, если что-то случится.

Автор: TheDecks Размещён: 11.08.2019 07:46
Вопросы из категории :
32x32