Как перебрать весь каталог и выбрать только один класс из файла с несколькими классами в Python?

Я мог бы использовать некоторую помощь в переборе каталога с файлами нескольких классов. Каждый образец содержит два класса (например, первый образец в моей базе данных — 1001, и этот файл включает 1001.dat и 1001.hea), и я хочу выполнить итерацию по своему каталогу и получить доступ ко всем файлам .dat отдельно от файлов .hea. . Прямо сейчас простое перебор каталога приводит к ошибке File-Not-Found.

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

Используя базу данных ЭКГ PhysioNet, сейчас цель состоит в том, чтобы проанализировать каждый файл .dat (в моем примере ниже реализован тест Дики-Фуллера с использованием adfuller из statsmodels.tsa.stattools). Я загрузил свои данные в Google Colab, используя следующее:

from google.colab import files
uploaded = files.upload()

Я могу легко получить доступ к определенному образцу из моей базы данных. Например, если я хочу прочитать образец с помощью WFDB, я могу сделать это без проблем:

wfdb.rdsamp('1001') #1001 is the name of the first sample in my directory

Но когда я пытаюсь перебрать все эти образцы, я сталкиваюсь с проблемой. Вот что у меня есть до сих пор:

for dat in uploaded:
     file = wfdb.rdsamp(dat) #this is where I get the error (below)

В закомментированной строке я получаю следующую ошибку:

FileNotFoundError: [Errno 2] No such file or directory: '/content/1001.dat.hea'

Я считаю, что это потому, что каждый файл содержит два класса, как вы можете видеть, когда я печатаю тип моего файла...

Исходный код:

print(type(uploaded)) #print directory 'uploaded' type (declared in first code block)
for dat in uploaded:  #iterate through directory 'uploaded'
  print(type(dat))    #print file type

Результат:

<class 'dict'>
<class 'str'>
<class 'str'>

Итак, что я хочу сделать, это указать первый класс 'str' (то есть .dat). Мне нужно использовать только данные, содержащиеся в 1001.dat и т. д. Я просто не знаю, как указать это в Python.

Теперь, как и было обещано, еще немного кода для большего контекста.

Все это работает:

#get records. 
sample = '1001' #first sample in database
record = wfdb.rdrecord(sample)                  #read record
FHR = (wfdb.rdsamp(sample))[0][:,0]             #FHR with 0's; FHR = fetal heart rate
newFHR = [i for i in FHR if i > 0]              #FHR without values <= 0

#plot sample record
wfdb.plot_wfdb(record = record, title = sample)

DF_test_result = adfuller(FHR)     #Dickey-Fuller Test

#print results
print ("Results with values <= 0")
print ( "ADF:")
ADF = DF_test_result[0]
print(ADF, "\n")

DF_test_result = adfuller(newFHR)  #Dickey-Fuller Test

#print results
print ("Results with values > 0")
print ( "ADF:")
ADF = DF_test_result[0]
print(ADF, "\n")

Это то, над чем я сейчас работаю. Мой синтаксис может быть не совсем правильным для тела моего цикла for (опять же, я новичок в Python), но я могу понять остальное, если смогу получить доступ к правильным образцам для каждой итерации:

#declare arrays for adf & pvals
adf = []
pvals = []

#get records
for dat in uploaded:
  file = wfdb.rdsamp(dat) #ERROR IS HERE
  FHR = file[0][:,0]                              #FHR with 0's
  newFHR = [i for i in FHR if i > 0]              #FHR without 0's

  DF_test_result = adfuller(newFHR)               #Dickey-Fuller Test
  adf.append(DF_test_result[0])                   #add adf
  pvals.append(DF_test_result[1])                 #add pvals

Спасибо, и обязательно дайте мне знать, как я мог бы отформатировать этот пост лучше. Я все еще учусь, как публиковать полезные вопросы на этой платформе. Это мой третий вопрос в StackOverflow.


person abelllizard    schedule 13.03.2020    source источник
comment
Скрипт работает в той же папке, что и файлы? Кажется, это так, поскольку wfdb.rdsamp('1001') успешно вызывает файл?   -  person PacketLoss    schedule 13.03.2020
comment
Как выглядит print(uploaded)?   -  person iz_    schedule 13.03.2020
comment
@iz_ извините за задержку - на этой неделе все ремонтные работы были устранены, и теперь я могу вернуться к проектам. Вывод для print(uploaded) беспорядок. Я опубликую первую часть этого, и дайте мне знать, если есть что-то, что вы хотите, чтобы я нашел. '1001.dat': b'\xca:\xbc\x   -  person abelllizard    schedule 24.03.2020


Ответы (2)


Я нашел ответ, немного изучив метод rdsamp()

rdsamp() не требует расширения для чтения правильного файла .dat. Вот почему rdsamp('1001') работает.

Таким образом, решение состоит в том, чтобы удалить последние 4 символа в строке:

for file in uploaded: print(file[:-4]) file = wfdb.rdsamp(file[:-4])

person abelllizard    schedule 24.03.2020

rdsamp использует имя записи без расширений файлов, поэтому вы должны вырезать его из имени файла:

for filename in uploaded:
    if not filename.endswith(".dat"):
        continue  # Skip .hea and others

    file = wfdb.rdsamp(filename[:-4])
person frost-nzcr4    schedule 13.03.2020
comment
Ваше решение выглядело многообещающе, но, увы, та же ошибка вывода... FileNotFoundError: [Errno 2] No such file or directory: '/content/1001.dat.hea' - person abelllizard; 24.03.2020
comment
Вау, я поставил двоеточие не там, должно быть [:-4], а не [-4:] - person frost-nzcr4; 25.03.2020