파이썬에서 자료 리스트 원하는대로 출력 방법 + 특정 폴더의 파일을 순서대로 반복해서 읽는 방법

조회수 56회

안녕하세요, 지난 번 xml 파일 데이터로 이곳에서 주신 도움을 받아 감사하게도 xml 파일에서 제가 원하는 정보를 추출할 수 되었습니다. 워낙 초보자라 뚝딱뚝딱하며 천천히 했지만 실제로 되니까 성취감도 드네요.

다시 한 번 큰 도움 주셔서 감사드리고, 이 xml파일이 여러 개일 때 한 폴더에 몰아넣고 파일을 자동으로 로딩 시켜 분배시키는 작업에서 또 막혀서 다시 한 번 질문을 드립니다( 2-2 번에서 xml 파일 분류 때 ID/DATE/INTERPRETATION의 3열로 자료를 배열할 수 있도록 코드를 어떻게 수정하면 좋을 지도 여줘봅니다).

사실 제가 진행하고 있는 업무가 심전도 관련 정보(xml)를 csv로 옮겨서 이를 등록시키는 것인데요, 같이 일하시는 분들께서 수작업으로 하나씩 모두 타이핑을 치고 계신 것이 안타까워 그 분들의 노고를 조금이라도 줄여보고자 나름대로 아이디어를 짜보고 노력해보고 있지만 혼자서는 쉽지가 않네요.

제가 진행하는 작업이 여러 파일에 있어 나름대로 순서를 정하였는데요.

1) 폴더의 xml 파일이름을 1부터 순서대로 바꾸기 -> 해결

import os
file_path = "C:\\VSC\\1"

file_names = os.listdir(file_path)
file_names
i = 1
for name in file_names:
    src = os.path.join(file_path, name)
    dst = str(i) + '.xml'
    dst = os.path.join(file_path, dst)
    os.rename(src, dst)
    i += 1

2) 반복문으로 xml을 파일을 파이썬에 계속 로딩 시키며 원하는 정보 분류해내기

2-1) xml 파일 불러오기 반복문 -> 이 부분에서 막혔는데 os나 pathlib을 사용해도 제가 지정한 폴더의 파일 리스트를 보는 정도이고, 반복문에서 파일 로딩을 시키지 못해 막히네요.

for a in os.listdir('C:\\VSC\\1'):
    if a.endswith('.xml'):
        j =1
        while j < len(file_names)):
            file_name = str(j) +'.xml'
            file_path = '/VSC/xml/' + str(j) + '.xml'
            with open(file_path) as f:
                lines = f.readlines()

2-2) 불러온 xml 파일 정보 분류

dir_path = '/VSC/1'

file_name = '1.xml'
print(os.path.join(dir_path, file_name))

file_path = "/VSC/1/1.xml"

with open(file_path, 'rt', encoding='utf-16') as f:
    lines = f.readlines()

ali=[]
for word in lines:
    if 'interpretation date' in word:
        ali.append(word)
    elif 'patientid' in word:
        ali.append(word)
    elif 'leftstatement' in word:
        ali.append(word)
ali.remove('\t\t\t<uniquepatientid/>\n')
ali.remove('\t\t\t<ns0:uniquepatientid />\n')
print(ali) #['\t\t\t<patientid>02240475</patientid>\n', '\t\t<interpretation date="2021-11-15" time="09:18:53" criteriaversion="0A" criteriaversiondate="2002-06-21">\n', '\t\t\t\t<leftstatement>SINUS RHYTHM</leftstatement>\n']

ali1=[]
for i in range(len(ali)):
    if "\t\t\t<ns0:patientid>" in ali[i]:
        ali[i] = ali[i].replace("\t\t\t<ns0:patientid>", "")    
        if "</ns0:patientid>\n" in ali[i]:
            ali[i] = ali[i].replace("</ns0:patientid>\n", "") 
    elif "\t\t\t<patientid>" in ali[i]:
        ali[i] = ali[i].replace("\t\t\t<patientid>", "")    
        if "</patientid>\n" in ali[i]:
            ali[i] = ali[i].replace("</patientid>\n", "") 
    elif "\t\t\t\t<ns0:leftstatement>" in ali[i]:
        ali[i] = ali[i].replace("\t\t\t\t<ns0:leftstatement>", "")
        if "</ns0:leftstatement>\n" in ali[i]:
            ali[i] = ali[i].replace("</ns0:leftstatement>\n", "")
    elif "\t\t\t\t<leftstatement>" in ali[i]:
        ali[i] = ali[i].replace("\t\t\t\t<leftstatement>", "")
        if "</leftstatement>\n" in ali[i]:
            ali[i] = ali[i].replace("</leftstatement>\n", "")
    elif '\t\t<ns0:interpretation date="' in ali[i]:
        ali[i] = ali[i].replace('\t\t<ns0:interpretation date="', '')
        ali[i] = ali[i][0:10]
        if '" time="' in ali[i]:
            ali[i] = ali[i].split('" time="')   
    elif '\t\t<interpretation date="' in ali[i]:
        ali[i] = ali[i].replace('\t\t<interpretation date="', '')
        ali[i] = ali[i][0:10]
        if '" time="' in ali[i]:
            ali[i] = ali[i].split('" time="')   

ali1 = [ali[0]]+[ali[1]]+[", ".join(ali[2:])+"."]
print(ali1) #['02240475', '2021-11-15', 'SINUS RHYTHM.']

3) xml -> csv 저장 -> 해결.

import pandas as pd
from pandas import DataFrame

df = pd.DataFrame(ali1)
df =df.transpose()
df.to_csv('test2.csv',index=False)

2-1)에서 xml 파일 불러오기 반복문을 설정하는게 넘나 쉽지 않아서 xml 파일을 merge해볼까도 생각하고 여러 군데 찾아보았지만 역시나 신통치 않아서 이용자분들께 도움을 요청드립니다. 힌트, 조언이나 의견주시면 또 열심히 찾아보고 해보겠습니다. 감사합니다!

''' 질문 드린 부분은 일단cmd에서 C:\VSC\1>type *.xml > all.xml 명령어 넣고 파일 돌리기로 하였는데, 추가적으로 궁금한 부분 여쭤봅니다. 파일을 3개를 합쳐서 위의 코드대로 돌려보았더니 자료가 1행 N열로 배열이 되는데요. 2-2에서 ID/DATE/INTERPRETATION으로 분류할 수 있도록 코드를 수정하려면 어떻게해야할까요? '''

  • 아이구 어렵게 하시네. xml2dict 라는 패키지가 있어요. 이게 xml 다룰 때 좀 편리해요. daewon 2021.11.22 18:41

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.