Radi_tech’s blog

Radiological technologist in Japan / MRI / AI / Deep learning / MATLAB / R / Python

【Python】DICOMデータをシーケンス名でフォルダ分け

DICOMデータをシーケンス名でフォルダ分けする。
DICOMデータはあらかじめフォルダごとに分けられているが、名前は降られていない状態。

import os 
ws = "work spaceのフォルダ名"
os.chdir(ws)


import shutil
import pydicom

fd_main = "DICOMデータが入っているフォルダ名"
fds = os.listdir(fd_main)
fds = [fd for fd in fds if not fd.startswith('.')]

fd_destination = "D:/MEGA\MEGAsync/ws_20240331_rename_folder/rename_head_MRI"

if not os.path.exists(fd_destination):
    os.mkdir(fd_destination)



for fd in fds:
    tmp_pt_fd = os.path.join(fd_main, fd)    
    fds_sq     = os.listdir(tmp_pt_fd)
    
    for fd_sq in fds_sq:
        tmp_sq_fd = os.path.join(tmp_pt_fd, fd_sq)
        
        fls = os.listdir(tmp_sq_fd)
        
        tmp_dcm_fl = os.path.join(tmp_sq_fd, fls[0])
        
        dcm = pydicom.dcmread(tmp_dcm_fl)
    
        sq_name = fd_sq + "_" + dcm.SeriesDescription
        
        # processing "T2*"
        if '*' in sq_name:
            sq_name = sq_name.replace("*", "_star_")
        
        new_sq_fd_name = os.path.join(fd_destination, fd, sq_name)
        
        # copy
        if not os.path.exists(new_sq_fd_name):
            shutil.copytree(tmp_sq_fd, new_sq_fd_name)
            print(f"Folder '{tmp_sq_fd}' copied to '{new_sq_fd_name}'.")
        else:
            print(f"Folder '{new_sq_fd_name}' already exists. Skipping copying.")
        
        
        
print("Processing finish")

【Python】Youtubeを高画質でダウンロードする

import os
main_fd = "ワークスペースを書く"
os.chdir(main_fd)

from pytube import YouTube
import csv
import pandas as pd
from moviepy.editor import *
import os

#設定を書く
from yt_dlp import YoutubeDL
with YoutubeDL() as ydl:
    
    ydl_video_opts = {
    'outtmpl': '%(id)s'+'_.mp4',
    'format': 'bestvideo'
}


# CSVファイルのパスなど
csv_file_path = "CSVのファイルパスを書く"
reader = pd.read_csv(csv_file_path,  header=0, sep=',', encoding="cp932")
urls = reader["URL"]



#ダウンロードの実行
for url in urls:

    #メタデータ取得
    with YoutubeDL() as ydl:
        res = ydl.extract_info(url, download=False)

    #動画取得
    ydl_video_opts = {
        'outtmpl': 'video.mp4',
        'format': 'bestvideo/best'
    }
    with YoutubeDL(ydl_video_opts) as ydl:
        ydl.download([url])

    #音声取得
    ydl_audio_opts = {
        'outtmpl': 'audio.mp3',
        'format': 'bestaudio/best'
    }
    with YoutubeDL(ydl_audio_opts) as ydl:
        ydl.download([url])

    #動画・音声結合&出力
    videoclip = VideoFileClip("video.mp4")
    audioclip = AudioFileClip("audio.mp3")
    output_video = videoclip.set_audio(audioclip)
    output_video.write_videofile(res['id'] + ".mp4")

    #一時ファイルの削除
    os.remove('video.mp4')
    os.remove('audio.mp3')


【Python】Youtube APIを利用して,任意keywordの検索結果を得る.(URL, チャンネル登録者数, 再生数,Uploadの日付)

CSVは、”検索ワード_result.csv”でワークスペースに保存される。

import os
import csv
from googleapiclient.discovery import build


ws = "ここにワークスペースを入力"
os.chdir(ws)

# YouTube APIキーを設定
api_key = "ここに自分のAPIキーを入力してください"

#keyword
keyword = "keywordを入力"


# YouTube APIのビルド
youtube = build('youtube', 'v3', developerKey=api_key)

def search_youtube_videos(keyword, max_results=200):
    # YouTube APIを使用して動画を検索
    search_response = youtube.search().list(
        q=keyword,
        type='video',
        part='id,snippet',
        maxResults=max_results
    ).execute()
    
    
    #csvファイルの名前
    csv_name = keyword + "_result.csv"

    # 検索結果をCSVファイルに保存
    with open(csv_name, 'w', newline='', encoding='utf-8') as csvfile:
        fieldnames = ['Title', 'Video ID', 'URL', 'View Count', 'Subscriber Count', 'Published At']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        
        # CSVファイルのヘッダーを書き込む
        writer.writeheader()

        # 検索結果から情報を取得してCSVに書き込む
        for item in search_response['items']:
            title = item['snippet']['title']
            video_id = item['id']['videoId']
            url = f'https://www.youtube.com/watch?v={video_id}'

            # 動画の詳細情報を取得
            video_response = youtube.videos().list(
                part='statistics,snippet',
                id=video_id
            ).execute()

            # 再生回数を取得
            view_count = video_response['items'][0]['statistics']['viewCount']

            # チャンネルの詳細情報を取得
            channel_id = item['snippet']['channelId']
            channel_response = youtube.channels().list(
                part='statistics',
                id=channel_id
            ).execute()

            # サブスクライバー数を取得
            subscriber_count = channel_response['items'][0]['statistics']['subscriberCount']
            
            # アップロード日付を取得
            published_at = video_response['items'][0]['snippet']['publishedAt']

            # CSVに書き込む
            writer.writerow({'Title': title, 'Video ID': video_id, 'URL': url, 'View Count': view_count, 'Subscriber Count': subscriber_count, 'Published At': published_at})

    print("Finish work")


if __name__ == '__main__':
    # 検索するキーワードを指定
    search_keyword = keyword  # 任意のキーワードを指定してください
    
    # 検索結果をCSVファイルに保存
    search_youtube_videos(search_keyword)


【Python】CSVにまとめてるURLのYoutubeを一括ダウンロードする方法


import os
main_fd = "作業用フォルダを書く"
os.chdir(main_fd)

from pytube import YouTube
import csv

#関数を定義
def download_youtube_video(url, output_folder):
    try:
        yt = YouTube(url)
        video = yt.streams.filter(file_extension="mp4", progressive=True).first()
        video.download(output_folder)
        print(f"Video {yt.title} downloaded successfully.")
    except Exception as e:
        print(f"Error downloading video from {url}: {e}")

def download_videos_from_csv(csv_path, output_folder):
    with open(csv_path, "r", encoding="utf-8") as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            video_url = row[0]
            download_youtube_video(video_url, output_folder)


# csvのファイルパスと保存用のフォルダ
csv_file_path = "url.csv"
output_folder_path = "保存用フォルダを書く"

#ダウンロードの実行
download_videos_from_csv(csv_file_path, output_folder_path)

【Python】YoutubeをPythonで簡単にダウンロード

YoutubeをPythonで簡単にダウンロード。
秒殺です。

〜
import os
import glob
ws = "ワークスペースフォルダを書く"

os.chdir(ws)


from yt_dlp import YoutubeDL

urls = "ダウンロードをしたURLを書く"

from yt_dlp import YoutubeDL

# ダウンロードしたい動画のyoutubeのurl(複数指定可能)
urls = [urls]

# 設定
ydl_opts = {
    "format": "best",

}


# ダウンロード
with YoutubeDL(ydl_opts) as ydl:
    result = ydl.download(urls)

print("FInished")
〜


ダウンロードは自己責任で!!

【Python】Pandasでcsvを読み込んで縦結合して重複を削除

Pandasでcsvを読み込んで縦結合して重複を削除するコード
例えば、研究会のEmalアドレス管理などに便利

〜
import os
import pandas as pd


ws = "ワークスペースのpathを書く"
os.chdir(ws)


csv_1 = os.path.join(ws,"001.csv")
csv_2 = os.path.join(ws,"002.csv")
csv_3 = os.path.join(ws,"003.csv")
csv_4 = os.path.join(ws,"004.csv")
csv_5 = os.path.join(ws,"005.csv")

df_1 = pd.read_csv(csv_1,  header=0, sep=',', encoding="cp932")
df_2 = pd.read_csv(csv_2,  header=0, sep=',', encoding="cp932")
df_3 = pd.read_csv(csv_3,  header=0, sep=',', encoding="cp932")
df_4 = pd.read_csv(csv_4,  header=0, sep=',', encoding="cp932")
df_5 = pd.read_csv(csv_5,  header=0, sep=',', encoding="cp932")

# 縦に結合
df_sum =  pd.concat([df_1, df_2, df_3, df_4, df_5])

# Emailが重複する人を削除して、Excelでoutput (csvだと文字化けした。。。)
#削除する列をcolum名で指定

df = df_sum.drop_duplicates(subset='Email')
df.to_excel('clean_email.xlsx', header= True, index=True, encoding='utf-8')

〜

【Python】Windowsでpandasを使いCSVを読み込む

Windowsでpandasを使いCSVを読み込む

〜
import pandas as pd

csv_path = "ファイルのパスを書く"

#一行目をheaderとして使用する
df = pd.read_csv(csv_path,  header=0, sep=',', encoding="cp932")
〜