В каталоге у меня будет любое количество файлов. Все имена файлов будут содержать «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:
Попробуйте отсортировать перед циклом:
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']
Да, все файлы в каталоге будут соответствовать шаблону *_R*.csv
.
Вы можете использовать модуль 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' перед скобкой { "необработанный файл"?
Нет. rf
— это синтаксис строкового литерала в Python. r
означает, что это необработанный строковый литерал. f
означает, что это f-строка для интерполяции строк. @common_bot9999
Хорошо, я использовал
collected = os.listdir(directory)
flist = list(collected)
flist.sort()
first_file = flist[0]
print(first_file)
OP должен указать, есть ли у них файлы в каталоге, в котором не соответствует шаблону
*_R*.csv
, но это прерывается, если такие файлы существуют, посколькуre.findall()
возвращает пустой список. Вероятно, стоит сначала отфильтровать все, что не соответствует шаблону.