Как перебрать несколько файлов по имени в заданном диапазоне? - PullRequest
0 голосов
/ 18 января 2020

Итак, я пытаюсь перебрать несколько файлов xml из библиотеки, которая содержит более 100 тыс. Файлов, мне нужно перечислить файлы по 3 последним цифрам. Ожидаемый результат - список файлов с именами «asset-PD471090» на «asset-PD471110» или «asset-GT888185» на «asset-GT888209» и т. Д.

Мой код -

'' '

import glob

strtid = input('From ID: ') # First file in range
seps = strtid[-3:]
endid = input('To ID: ') # Last file in range
eeps = endid[-3:] 
FileId = strtid[:5] # always same File Id for whole range

for name in glob.iglob('asset-' + FileId + [seps-eeps] + '.xml', recursive=True):
    print(name) # iterate over every file in given range and print file names.

' '' Я получаю ошибку:

TypeError: неподдерживаемые типы операндов для -: 'str' и 'str '

Как загрузить определенный c диапазон входных файлов?

1 Ответ

0 голосов
/ 19 января 2020

Как говорит ошибка: вы пытаетесь использовать - для строк:

strtid = input('From ID: ') # string
seps = strtid[-3:]          # part of a string

endid = input('To ID: ')    # string 
eeps = endid[-3:]           # part of a string

FileId = strtid[:5]         # also part of a string 

# [seps-eeps]: trying to substract a string from a string:    
for name in glob.iglob('asset-' + FileId + [seps-eeps] + '.xml', recursive=True):

Вы можете преобразовать строку в целое число, используя int("1234") - не будет Хотя вам очень поможет, потому что тогда у вас есть только один (неправильный) номер для вашего iglob.

Если вы хотите задать их как шаблон глобуса, вам нужно будет заключить их в ограничители строк - и glob не работает таким образом с номерами:

  • "[123-678]" будет one di git из 1,2,3,4,5,6,7, 8 - не 123 до 678

Однако вы можете проверить свои файлы самостоятельно:

import os

def get_files(directory, prefix, postfix, numbers):
    lp = len(prefix)       # your assets-GT
    li = len(postfix) + 4  # your id + ".xml"
    for root, dirs, files in os.walk(directory):
        for file in sorted(files): # sorted to get files in order, might not need it
            if int(file[lp:len(file)-li]) in numbers:
                yield os.path.join(root,file)

d = "test"
prefix = "asset-GT"  # input("Basename: ")
postfix = "185"      # input("Id: ")

# create demo files to search into
os.makedirs(d)
for i in range(50,100):
    with open (os.path.join(d,f"{prefix}{i:03}{postfix}.xml"),"w") as f:
        f.write("")

# search params        
fromto = "75 92"     # input("From To (space seperated numbers): ")

fr, to = map(int,fromto.strip().split()) 
to += 1 # range upper limit is exclusive, so need to add 1 to include it

all_searched = list(get_files("./test", prefix, postfix, range(fr,to)))
print(*all_searched, sep="\n")

Вывод:

./test/asset-GT075185.xml
./test/asset-GT076185.xml
./test/asset-GT077185.xml
./test/asset-GT078185.xml
./test/asset-GT079185.xml
./test/asset-GT080185.xml
./test/asset-GT081185.xml
./test/asset-GT082185.xml
./test/asset-GT083185.xml
./test/asset-GT084185.xml
./test/asset-GT085185.xml
./test/asset-GT086185.xml
./test/asset-GT087185.xml
./test/asset-GT088185.xml
./test/asset-GT089185.xml
./test/asset-GT090185.xml
./test/asset-GT091185.xml
./test/asset-GT092185.xml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...