Как перебрать весь каталог и выбрать только один класс из файла мультикласса в Python? - PullRequest
2 голосов
/ 13 марта 2020

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

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

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

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

Я могу легко получить указанный образец c из своей базы данных. Например, если я хочу прочитать пример с помощью 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, et c. Я просто не знаю, как это указать в 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")

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

#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.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

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

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

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

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

0 голосов
/ 13 марта 2020

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

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

    file = wfdb.rdsamp(filename[:-4])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...