Сопоставить все файлы в каталоге от наименьшего целого числа к наибольшему, затем начать с наименьшего

В каталоге у меня будет любое количество файлов. Все имена файлов будут содержать «R1» или «R2», «R3» и т. д. внутри. например этот файл_R1.csv. Номера «R» в этом каталоге не всегда будут согласовываться, поэтому иногда самым низким может быть «R3» и последовательно запускаться до «R15».

Мне нужен способ, чтобы python начинал с наименьшего целого числа файлов R * в каталоге, а затем переходил к последнему целому числу «R», как способ последовательного редактирования файлов от самого низкого до самого высокого.

procdir = r"C:\Users\processed"

collected = os.listdir(procdir)
for f in collected:
    #if fnmatch.fnmatch(f, '*R*.csv'):
   if "R*.csv" in collected:
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
25
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте отсортировать перед циклом:

import re

files = sorted(collected, key=lambda x: int(re.findall(".*R(\d+).*.csv", x)[0]))

Пример:

collected = ["thisfile_R1.csv", "R15.csv", "this_R2_file.csv"]

>>> sorted(collected, key=lambda x: int(re.findall(".*R(\d+).*.csv", x)[0]))
['thisfile_R1.csv', 'this_R2_file.csv', 'R15.csv']

OP должен указать, есть ли у них файлы в каталоге, в котором не соответствует шаблону *_R*.csv, но это прерывается, если такие файлы существуют, поскольку re.findall() возвращает пустой список. Вероятно, стоит сначала отфильтровать все, что не соответствует шаблону.

Pranav Hosangadi 06.04.2022 19:21

Да, все файлы в каталоге будут соответствовать шаблону *_R*.csv.

common_bot9999 07.04.2022 01:54
Ответ принят как подходящий

Вы можете использовать модуль glob, чтобы выбрать только те имена файлов, которые соответствуют вашему шаблону:

import glob

procdir = r"C:\Users\processed"
files = glob.glob(rf"{procdir}\*R*.csv")

Затем используйте sorted() с аргументом key, чтобы получить число и отсортировать его:

files_sorted = sorted(files, key=lambda x: int(re.findall(r"R(\d+)", x)[-1]))

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

Если в вашем каталоге были файлы:

files = [r"C:\Users\processed\file_R1.csv",
         r"C:\Users\processed\file_R100.csv",
         r"C:\Users\processed\file_R13.csv",
         r"C:\Users\processed\file_R3.csv",
         r"C:\Users\processed\file_R30.csv"]

вы получите отсортированные файлы следующим образом:

['C:\\Users\\processed\\file_R1.csv',
 'C:\\Users\\processed\\file_R3.csv',
 'C:\\Users\\processed\\file_R13.csv',
 'C:\\Users\\processed\\file_R30.csv',
 'C:\\Users\\processed\\file_R100.csv']

'files = glob.glob(rf"{procdir}*R*.csv")', означает ли здесь 'rf' перед скобкой { "необработанный файл"?

common_bot9999 06.04.2022 20:10

Нет. rf — это синтаксис строкового литерала в Python. r означает, что это необработанный строковый литерал. f означает, что это f-строка для интерполяции строк. @common_bot9999

Pranav Hosangadi 06.04.2022 20:18

Хорошо, я использовал

collected = os.listdir(directory)

flist = list(collected)
flist.sort()
first_file = flist[0]
print(first_file)

Другие вопросы по теме