Функция re.findAll () в Python не будет работать должным образом

1

Я пытаюсь создать скрипт python, который найдет все файлы из рабочего каталога с определенным шаблоном имени.

Я сохранил все файлы в списке, а затем попытался применить метод re.findall в списке, чтобы получить только список файлов с таким шаблоном имен.

Я написал этот код:

# Create the regex object that we will use to find our files
fileRegex = re.compile(r'A[0-9]*[a-z]*[0-9]*.*')
all_files = []

# Recursevly read the contents of the working_dir/Main folder #:
for folderName, subfolders, filenames in os.walk(working_directory + "/Main"):
    for filename in filenames:
        all_files.append(filename)

found_files = fileRegex.findall(all_files)

Я получаю эту ошибку в последней строке кода:

TypeError: expected string or bytes-like object

Я также попробовал re.findall(all_files) вместо использования 'fileRegex', созданного до этой строки. Такая же ошибка. Пожалуйста, скажите мне, что я делаю неправильно. Большое вам спасибо за чтение моего сообщения!

Изменить (второй вопрос): Я следовал ответам, и теперь он работает нормально. Я пытаюсь создать архив с файлами, которые соответствуют этому шаблону после того, как я их нашел. Архив был создан, однако, как я написал код, весь путь к файлу попадает в архив (все папки из/до файла). Я просто хочу, чтобы файл был включен в окончательный.zip не все каталоги и подкаталоги, которые делают путь к нему.

Вот код. Генерация.zipfile находится внизу. Пожалуйста, дайте мне совет, как я могу это решить. Я пробовал много вещей, но никто не работал. Спасибо:

# Project properties:

#  Recursively read the contents of the 'Main' folder which contains files with different names.
#  Select only the files whose name begin with letter A and contain digits in it. Use regexes for this.
#  Archive these files in a folder named 'Created_Archive' in the project directory. Give the archive a name of your choosing.


# Files that you should find are:
  # Aerials3.txt, Albert0512.txt, Alberto1341.txt


########################################################################################################################################
import os
import re
import zipfile
from pathlib import Path

# Get to the proper working directory
working_directory = os.getcwd()
if working_directory != "/home/paul/Desktop/Python_Tutorials/Projects/Files_And_Archive":
  working_directory = "/home/paul/Desktop/Python_Tutorials/Projects/Files_And_Archive"
  os.chdir(working_directory)

check_archive = Path(os.getcwd() + "/" + "files.zip")
if check_archive.is_file():
    print("Yes. Deleting it and creating it.")
    os.unlink(os.getcwd() + "/" + "files.zip")
else:
    print("No. Creating it.")

# Create the regex object that we will use to find our files
fileRegex = re.compile(r'A[0-9]*[a-z]*[0-9]+.*')
found_files = []

# Create the zipfile object that we will use to create our archive
fileArchive = zipfile.ZipFile('files.zip', 'a')

# Recursevly read the contents of the working_dir/Main folder #:
for folderName, subfolders, filenames in os.walk(working_directory + "/Main"):
    for filename in filenames:
        if fileRegex.match(filename):
            found_files.append(folderName + "/" + filename)

# Check all files have been found and create the archive. If the archive already exists
# delete it.


for file in found_files:
    print(file)
    fileArchive.write(file, compress_type=zipfile.ZIP_DEFLATED)

fileArchive.close()
Теги:

3 ответа

3

re.findAll работает с строками не в списках, поэтому лучше использовать r.match над списком для фильтрации тех, которые на самом деле совпадают:

found_files = [s for s in all_files if fileRegex.match(s)]
1

regex работает над строками, а не списками. следующие работы

import re
import os

# Create the regex object that we will use to find our files
# fileRegex = re.compile(r'A[0-9]*[a-z]*[0-9]*.*')
fileRegex = re.compile(r'.*\.py')
all_files = []
found_files = []

working_directory = r"C:\Users\michael\PycharmProjects\work"

# Recursevly read the contents of the working_dir/Main folder #:
for folderName, subfolders, filenames in os.walk(working_directory):
    for filename in filenames:
        all_files.append(filename)
        if fileRegex.search(filename):
            found_files.append(filename)

print('all files\n', all_files)
print('\nfound files\n', found_files)
0

re.findall не принимает список строк. Вам нужно re.match.

# Create the regex object that we will use to find our files
fileRegex = re.compile(r'A[0-9]*[a-z]*[0-9]*.*')
all_files = []

# Recursively read the contents of the working_dir/Main folder #:
for folderName, subfolders, filenames in os.walk(working_directory + "/Main"):
    for filename in filenames:
        all_files.append(filename)

found_files = [file_name for file_name in all_files if fileRegex.match(file_name)]
  • 0
    чем этот ответ на самом деле отличается от того, который уже был? пожалуйста, избегайте дублирования ответов без дополнительной информации о них;)
  • 0
    @ Netwave Там не было ответа, когда я начал на нем.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню