<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DevOps Engineer</title>
    <link>https://pydole.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 23:08:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Pydole</managingEditor>
    <image>
      <title>DevOps Engineer</title>
      <url>https://tistory1.daumcdn.net/tistory/2895779/attach/b0720ba932bd428a92cfaa8786822fce</url>
      <link>https://pydole.tistory.com</link>
    </image>
    <item>
      <title>[ Python ] Python ORM sqlalchemy 이용한 DataFrame Data Insert</title>
      <link>https://pydole.tistory.com/entry/Python-sqlalchemy%EC%99%80-pymysql%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-pandas-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%94%84%EB%A0%88%EC%9E%84-Mysql-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A3%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SQLAlchemy 은 &lt;/span&gt;대표적인 파이썬 ORM 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ORM이란 객체 관계 매핑(Object Relational Mapping)으로 데이터베이스 내의 테이블들을 객체화하여 각 DBMS에 대해서 CRUD (Create(생성), Read(읽기), Update(갱신), Delete(삭제)) 등 을 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로그램이 커지게 되면, SQL쿼리도 많아지게 되는 데, 반복되는 SQL 쿼리를 처리하기 유용하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 모듈설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1695994746767&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install pandas
pip install SQLAlchemy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 접속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1695994508091&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
from sqlalchemy import create_engine

# DataFrame 생성

df = pd.DataFrame(rows,columns=['Col_A','Col_B','Col_C','Col_D','Col_E','Col_F'])

# 컬럼은 DB컬럼과 동일

db_connection = 'mysql+pymysql://{user}:{password}@{host}/{database}'
db_connection = create_engine(db_connection)
conn = db_connection.connect()


df.to_sql(name='{table_name}', con=db_connection, if_exists='append',index=False)

# Databse Name : table_name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/529</guid>
      <comments>https://pydole.tistory.com/entry/Python-sqlalchemy%EC%99%80-pymysql%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-pandas-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%94%84%EB%A0%88%EC%9E%84-Mysql-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%84%A3%EA%B8%B0#entry529comment</comments>
      <pubDate>Fri, 29 Sep 2023 22:39:19 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용한 RDS 변경 가능한 인스턴스 타입 확인하기</title>
      <link>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-RDS-%EB%B3%80%EA%B2%BD-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%ED%83%80%EC%9E%85-%EB%B3%B4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 Mysql 8.0.32에서 db.t3.medium 인스턴스를 운영하고 있고, AWS Graviton2 인스턴스로 변경 하려한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;rds의 client.describe_orderable_db_instance_options 메소드를 이용하여 확인 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686820161539&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3

client = boto3.client('rds')

def OrderableDBInstance(Engine,EngineVersion,dbInstanceclass):
    response = client.describe_orderable_db_instance_options(
        Engine=Engine,
        EngineVersion=EngineVersion,
        DBInstanceClass=dbInstanceclass,
        MaxRecords=123)
        
    return response['OrderableDBInstanceOptions']

engine = 'mysql'
engineVersion = '8.0.32'
dbInstanceclass = 'db.t4g.medium'
storagetype = 'gp3'

for i in OrderableDBInstance(Engine,EngineVersion,dbInstanceclass):
    if i['StorageType'] == storagetype:
        print(i['DBInstanceClass'])
        
------------------------------------------------------------------------------
db.t4g.medium&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Document : &lt;a href=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/neptune/client/describe_orderable_db_instance_options.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/neptune/client/describe_orderable_db_instance_options.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686821331160&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;describe_orderable_db_instance_options - Boto3 1.26.153 documentation&quot; data-og-description=&quot;Previous describe_global_clusters&quot; data-og-host=&quot;boto3.amazonaws.com&quot; data-og-source-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/neptune/client/describe_orderable_db_instance_options.html&quot; data-og-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/neptune/client/describe_orderable_db_instance_options.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/neptune/client/describe_orderable_db_instance_options.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/neptune/client/describe_orderable_db_instance_options.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;describe_orderable_db_instance_options - Boto3 1.26.153 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Previous describe_global_clusters&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;boto3.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/528</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-RDS-%EB%B3%80%EA%B2%BD-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%ED%83%80%EC%9E%85-%EB%B3%B4%EA%B8%B0#entry528comment</comments>
      <pubDate>Thu, 15 Jun 2023 18:14:42 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용하여 ElastiCache Database 메모리 사용량 확인</title>
      <link>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-ElastiCache-Database-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%B6%94%EC%B6%9C-%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685512973832&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import datetime
from datetime import timedelta
import boto3

cloudwatch = boto3.client('cloudwatch')  

def elastiCache_Database_Memory():
    # 샘플 2023년 5월 1일 데이터
    
    st = datetime(2023,5,1,0,0,0) - timedelta(hours=9)
    et = st + timedelta(days=1)

    response = cloudwatch.get_metric_statistics(
            Namespace='AWS/ElastiCache',
            MetricName='DatabaseMemoryUsagePercentage',
            Dimensions=[
                { 
                 'Name': 'CacheClusterId',
                 'Value': 'string'},         # Cluster Node Name
                ],
            StartTime=st,
            EndTime=et,
            Period=3600,
            Statistics=['Average'],
            Unit='Percent')

    return response['Datapoints']

dct = {}

for i in elastiCache_Database_Memory():
    dct[i['Timestamp'] + timedelta(hours=9)] = round(i['Average'],2)
    # 출력되는 데이터는 한국시간으로 변환 UTC +0900

for k, v in sorted(dct.items()):
    print(str(k)[:19], v)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685513027765&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2023-05-01 00:00:00 0.32
2023-05-01 01:00:00 0.32
2023-05-01 02:00:00 0.32
2023-05-01 03:00:00 0.32
2023-05-01 04:00:00 0.32
2023-05-01 05:00:00 0.32
2023-05-01 06:00:00 0.32
2023-05-01 07:00:00 0.32
2023-05-01 08:00:00 0.32
2023-05-01 09:00:00 0.32
2023-05-01 10:00:00 0.32
2023-05-01 11:00:00 0.32
2023-05-01 12:00:00 0.32
2023-05-01 13:00:00 0.32
2023-05-01 14:00:00 0.32
2023-05-01 15:00:00 0.32
2023-05-01 16:00:00 0.32
2023-05-01 17:00:00 0.32
2023-05-01 18:00:00 0.32
2023-05-01 19:00:00 0.32
2023-05-01 20:00:00 0.32
2023-05-01 21:00:00 0.32
2023-05-01 22:00:00 0.32
2023-05-01 23:00:00 0.32&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/526</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-ElastiCache-Database-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%B6%94%EC%B6%9C-%ED%95%98%EA%B8%B0#entry526comment</comments>
      <pubDate>Wed, 31 May 2023 15:04:31 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] mp4 url 다운로드 후 다이렉트 S3 저장</title>
      <link>https://pydole.tistory.com/entry/Python-mp4-url-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%9B%84-%EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8-S3-%EC%A0%80%EC%9E%A5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684992379641&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests as req
import boto3

s3 = boto3.client('s3')

def mp4_save_s3():
    url = 'url'                # mp4 download url
    key = 'test.mp4'
    bucket = 'bucketname'      # bucketname
    
    res = req.get(url)
    res = s3.put_object(Bucket=bucket, Body=res.content, Key=key)
    
    return res['ResponseMetadata']['HTTPStatusCode']

mp4_save_s3()

-------------------------------------------------------------

200&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDWhMf/btshkOW4ErF/78Vi5vk3p0Yvx5GzSl5Zqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDWhMf/btshkOW4ErF/78Vi5vk3p0Yvx5GzSl5Zqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDWhMf/btshkOW4ErF/78Vi5vk3p0Yvx5GzSl5Zqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDWhMf%2FbtshkOW4ErF%2F78Vi5vk3p0Yvx5GzSl5Zqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;56&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/525</guid>
      <comments>https://pydole.tistory.com/entry/Python-mp4-url-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%9B%84-%EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8-S3-%EC%A0%80%EC%9E%A5#entry525comment</comments>
      <pubDate>Thu, 25 May 2023 14:27:41 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] requests 모듈 다양한 이용</title>
      <link>https://pydole.tistory.com/entry/Python-requests-%EB%AA%A8%EB%93%88-%EA%B8%B0%EC%B4%88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설치 : pip install requests&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. Response Text. (Text 출력)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1571055247983&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

with requests.Session() as s:
	r = s.get(site)
	print(r.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. Response Status Code. (응답코드 출력)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1571055268875&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

with requests.Session() as s:
	r = s.get(site)
	print(r.status_code)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. Response Encoding. (&lt;b&gt;Encoding 출력)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dart&quot; style=&quot;background-color: #ffffff; font-family: Consolas; font-size: 10pt;&quot;&gt;&lt;code&gt;import requests

with requests.Session() as s:
   r = s.get(site)
   print(r.encoding)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. Response Hearders. (Hearders 출력)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dart&quot; style=&quot;background-color: #ffffff; font-family: Consolas; font-size: 10pt;&quot;&gt;&lt;code&gt;import requests

with requests.Session() as s:
   r = s.get(site)
   print(r.headers)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;5. Response Json. (Json으로 응답)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1571055293068&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

with requests.Session() as s:
	r = s.get(site)
	print(r.json())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;6. header에 referer 정보 포함하여 호출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684980161652&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests as req

url = 'url'
res = req.get(url, headers={'referer': 'referer-test'})
res

--------------------------------------------------------

&amp;lt;Response [200]&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UFqgy/btshi6iTMJg/X2quQ43CWwEZqK3WCjiYbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UFqgy/btshi6iTMJg/X2quQ43CWwEZqK3WCjiYbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UFqgy/btshi6iTMJg/X2quQ43CWwEZqK3WCjiYbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUFqgy%2Fbtshi6iTMJg%2FX2quQ43CWwEZqK3WCjiYbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;36&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Document : &lt;a href=&quot;https://requests.readthedocs.io/en/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://requests.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684980286996&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Requests: HTTP for Humans&amp;trade; &amp;mdash; Requests 2.31.0 documentation&quot; data-og-description=&quot;Requests: HTTP for Humans&amp;trade; Release v2.31.0. (Installation) Requests is an elegant and simple HTTP library for Python, built for human beings. Behold, the power of Requests: &amp;gt;&amp;gt;&amp;gt; r = requests.get('https://api.github.com/user', auth=('user', 'pass')) &amp;gt;&amp;gt;&amp;gt; r.&quot; data-og-host=&quot;requests.readthedocs.io&quot; data-og-source-url=&quot;https://requests.readthedocs.io/en/latest/&quot; data-og-url=&quot;https://requests.readthedocs.io/en/latest/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://requests.readthedocs.io/en/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://requests.readthedocs.io/en/latest/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Requests: HTTP for Humans&amp;trade; &amp;mdash; Requests 2.31.0 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Requests: HTTP for Humans&amp;trade; Release v2.31.0. (Installation) Requests is an elegant and simple HTTP library for Python, built for human beings. Behold, the power of Requests: &amp;gt;&amp;gt;&amp;gt; r = requests.get('https://api.github.com/user', auth=('user', 'pass')) &amp;gt;&amp;gt;&amp;gt; r.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;requests.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>PYTHON</category>
      <category>python web</category>
      <category>requests</category>
      <category>파이썬</category>
      <category>파이썬 requests</category>
      <category>파이썬 requests json</category>
      <category>파이썬 requests 모듈</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/76</guid>
      <comments>https://pydole.tistory.com/entry/Python-requests-%EB%AA%A8%EB%93%88-%EA%B8%B0%EC%B4%88#entry76comment</comments>
      <pubDate>Thu, 25 May 2023 11:05:20 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] requests 모듈을 이용한 동영상 다운로드</title>
      <link>https://pydole.tistory.com/entry/Python-requests-%EB%AA%A8%EB%93%88%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8F%99%EC%98%81%EC%83%81-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684979570012&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests as req

url = 'url'                              #  url ( mp4, png )

saveFile = url.split('/')[-1]    

res = req.get(url)

with open(savefile, 'wb') as f:
    f.write(res.content)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/524</guid>
      <comments>https://pydole.tistory.com/entry/Python-requests-%EB%AA%A8%EB%93%88%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8F%99%EC%98%81%EC%83%81-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C#entry524comment</comments>
      <pubDate>Thu, 25 May 2023 10:58:26 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] 정규식 이용한 IP address 마스킹(감추기) 하기</title>
      <link>https://pydole.tistory.com/entry/Python-%EC%A0%95%EA%B7%9C%EC%8B%9D%EA%B3%BC-replace%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-ip%EC%A3%BC%EC%86%8C-%EB%A7%88%EC%8A%A4%ED%82%B9-%EC%B6%9C%EB%A0%A5</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정보보호를&amp;nbsp;목적으로&amp;nbsp;IP주소의&amp;nbsp;3번째&amp;nbsp;옥텟을&amp;nbsp;마스킹&amp;nbsp;처리해야&amp;nbsp;할&amp;nbsp;때,&amp;nbsp;정규식을 이용하여&amp;nbsp;마스킹&amp;nbsp;처리를&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1569851601042&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import re 

ipaddress = ('172.168.10.12', '192.168.2.11','192.168.114.12','11.12.0.14') 

p1 = re.compile(r&quot;(\d+)[.](\d+)[.](\d+)[.](\d+)&quot;)

# 정규식 패턴과 추출할 그룹 지정. 3번째 옥텟  

for i in ipaddress: 
    m1 = p1.search(i)
    print(m1.group(1) + '.' + m1.group(2) + '.' + '***' + '.' + m1.group(4))
    
    

------------------------------------------------------------------------------

172.168.***.12
192.168.***.11
192.168.***.12
11.12.***.14&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>IP주소</category>
      <category>ip주소 마스킹</category>
      <category>PYTHON</category>
      <category>python re</category>
      <category>정규식</category>
      <category>파이썬</category>
      <category>파이썬 정규식</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/6</guid>
      <comments>https://pydole.tistory.com/entry/Python-%EC%A0%95%EA%B7%9C%EC%8B%9D%EA%B3%BC-replace%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-ip%EC%A3%BC%EC%86%8C-%EB%A7%88%EC%8A%A4%ED%82%B9-%EC%B6%9C%EB%A0%A5#entry6comment</comments>
      <pubDate>Wed, 24 May 2023 17:21:48 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] 리눅스 iostat 결과값 DataFrame만들고, csv 저장</title>
      <link>https://pydole.tistory.com/entry/python%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-Linux-iostat-Disk-CSV%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%A0%80%EC%9E%A5</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-dd59e2de-fb1c-42e6-99c9-f72d69322e8e&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;iostat : CPU통계와 디바이스와 IO통계를 출력해주는 유틸&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;SE-597d833b-46b1-4cee-a71b-9208a1d58198&quot;&gt;
&lt;td id=&quot;SE-9ce162e3-529a-4e97-a9e8-b91f0bb0436e&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; tps&lt;/span&gt;&lt;/td&gt;
&lt;td id=&quot;SE-4da9170c-321d-4515-8f33-0a35ca11746d&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;장치에서 초당 입출력 작업 수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;SE-5cbb9fd8-58f9-4309-a6da-8611c90e9b0d&quot;&gt;
&lt;td id=&quot;SE-51928128-33eb-4637-9b8f-c705677af088&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; kB_read/s&lt;/span&gt;&lt;/td&gt;
&lt;td id=&quot;SE-dbe985ac-1a7b-48d9-be97-9084ec3171b5&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;장치에서 초당 읽은(Read) 데이터 블록 (초당)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;SE-780f90dc-f237-4496-b581-c97d28f43472&quot;&gt;
&lt;td id=&quot;SE-e7268a5d-41d5-4c9f-9199-695607afbe33&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; kB_wrtn/s&lt;/span&gt;&lt;/td&gt;
&lt;td id=&quot;SE-cffce346-5ec5-47e7-9f42-c4a451fb4122&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;장치에서 초당 쓴(Write) 데이터 블록 (초당)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;SE-e2321fb3-516e-4329-a4f4-174716be69f2&quot;&gt;
&lt;td id=&quot;SE-797b7be9-4af3-454b-838a-45c0fc153ac1&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; kB-read&lt;/span&gt;&lt;/td&gt;
&lt;td id=&quot;SE-5f5fbda4-1825-4318-bf72-1d89e6e5785d&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;장치에서 초당 읽은(Read) 데이터 블록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;SE-6688d2e7-a4d8-49cd-8c47-6bbfe677d6b4&quot;&gt;
&lt;td id=&quot;SE-df7924a0-1058-45ed-ac2d-9ccf0808d6b6&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; kB-wrtn&lt;/span&gt;&lt;/td&gt;
&lt;td id=&quot;SE-5b45406f-6289-418b-b8ce-750f049f9d1f&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;장치에서 초당 쓴(Write) 데이터 블록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-bf83e41d-fb75-4913-ad9b-0d87344da784&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[ 옵션 ]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; -m&amp;nbsp; MB단위로 표현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;iostats명령어의 결과를 DataFrame으로 만들고, csv 파일로 export&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568251409609&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import subprocess
from datetime import datetime
import time

def iostat_data():
    ps = subprocess.Popen(('iostat', '-m'), stdout=subprocess.PIPE)
    output = subprocess.check_output(('grep', 'nvme0n1'), stdin=ps.stdout)
    output = output.split()
    output = [ str(datetime.today())[:19] ] + [ x.decode()  for x in output ][1:]

    return output


data = []

for i in range(100):
    data.append(iostat_data())
    time.sleep(2)


import pandas as pd

df = pd.DataFrame(data, columns = ['timestamp','tps','kB_read/s','kB_wrtn/s','kB_read','kB_wrtn'])
print(df)
df.to_csv('output.csv')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by9MAM/btshb5Zpnme/R9eeLoGovvZxqbczkqYz2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by9MAM/btshb5Zpnme/R9eeLoGovvZxqbczkqYz2k/img.png&quot; data-alt=&quot;iostat dataframe&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by9MAM/btshb5Zpnme/R9eeLoGovvZxqbczkqYz2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby9MAM%2Fbtshb5Zpnme%2FR9eeLoGovvZxqbczkqYz2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;733&quot; height=&quot;308&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;iostat dataframe&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python for Linux</category>
      <category>iostat</category>
      <category>iostat 파일저장</category>
      <category>PYTHON</category>
      <category>Saving iostat using Python</category>
      <category>리눅스</category>
      <category>리눅스 디스크 모니터링</category>
      <category>리눅스iostat</category>
      <category>파이썬</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/265</guid>
      <comments>https://pydole.tistory.com/entry/python%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-Linux-iostat-Disk-CSV%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%A0%80%EC%9E%A5#entry265comment</comments>
      <pubDate>Wed, 24 May 2023 15:40:51 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] Prometheus metric 값 가져오기</title>
      <link>https://pydole.tistory.com/entry/Prometheus-python%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-metric-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Python을이용하여 promQL 쿼리하여 값 가져오기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sample Metric :&amp;nbsp; jvm_memory_used_bytes&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1646558612800&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from datetime import datetime

instance = '127.0.0.1:8080'
job = 'spring'
query = 'sum(jvm_memory_used_bytes{area=&quot;heap&quot;, instance=&quot;%s&quot;, job=&quot;%s&quot;})' % (instance,job)

def prometheus_data(instance,jop,query):
    response = requests.get('http://127.0.0.1:9090/api/v1/query', params={'query': query})
    response = response.json()['data']['result']
    response = response[0]['value']
    
    return datetime.fromtimestamp(int(response[0])), int(response[1])
    # Unix TimeStamp는 datetime 모듈로 일반타임으로 변경 리턴
    
    
print(prometheus_data(instance,job,query))

--------------------------------------------------------------------------------------------

(datetime.datetime(2023, 5, 24, 13, 44, 14), 5207844864)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;특정시간 때 Metric을 보고 싶을 때는,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684906619355&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import datetime
from datetime import timedelta

t = datetime.datetime.now(datetime.timezone.utc) - timedelta(days=1)

        ...... params={'query': query,'time':t.isoformat()}
   
        # 'time':RFC 3339 Format&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Document : &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/querying/api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://prometheus.io/docs/prometheus/latest/querying/api/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>API</category>
      <category>Prometheus</category>
      <category>PYTHON</category>
      <category>모니터링</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/479</guid>
      <comments>https://pydole.tistory.com/entry/Prometheus-python%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-metric-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0#entry479comment</comments>
      <pubDate>Wed, 24 May 2023 13:56:49 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] Linux 파일 (스토리지) 연도별 개수와 총 용량 구하기</title>
      <link>https://pydole.tistory.com/entry/Python%EA%B3%BC-Elasticsearch%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EB%B6%84%EC%84%9D</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582775212274&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from os import walk
from os.path import getsize
from os.path import getmtime
from datetime import datetime
from os import chdir

chdir(path)

resultFile = 'result.csv'

for (path, dir, files) in walk('.'):
    for filename in files:
        ext = filename.split('.')[-1]
        size = getsize(path + '\\' + filename)
        mtime = str(datetime.fromtimestamp(getmtime(path + '\\' + filename)))[:19]

        lst = '#'.join([ path, filename, ext, str(size), str(mtime)+'\n' ])
        with open(resultFile, 'a') as f:
            f.writelines(lst)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582780158104&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
from datetime import datetime
from elasticsearch.helpers import bulk
from elasticsearch import Elasticsearch

es = Elasticsearch(hosts=' ',port=' ', timeout=600)
ix = 'filelist'

es.indices.create(index=ix)

data = pd.read_csv(filename
                   , engine='python'
                   , sep='#'
                   , header=None
                   , names=['path', 'filename', 'ext', 'size','mtime'])

data['mtime'] = pd.to_datetime(data['mtime'], format='%Y-%m-%d %H:%M:%S')
data['size'] = data['size'].astype(np.int)
documents = data.to_dict(orient='records')
bulk(es, documents, index=ix, doc_type='_doc')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qkn9o/btqCioqM5se/r4kBKENBP5hAKCkKrwZ8k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qkn9o/btqCioqM5se/r4kBKENBP5hAKCkKrwZ8k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qkn9o/btqCioqM5se/r4kBKENBP5hAKCkKrwZ8k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQkn9o%2FbtqCioqM5se%2Fr4kBKENBP5hAKCkKrwZ8k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1217&quot; height=&quot;917&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/378</guid>
      <comments>https://pydole.tistory.com/entry/Python%EA%B3%BC-Elasticsearch%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EB%B6%84%EC%84%9D#entry378comment</comments>
      <pubDate>Wed, 24 May 2023 00:22:54 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] pandas plot 을 이용한 다양한 graph 그리기</title>
      <link>https://pydole.tistory.com/entry/Python-pandas-graph-area</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Pandas의 plot 을 이용하여 그래프 그리기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684851319780&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(20,6), 
                  columns=['a','b','c','d','e','f'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/67Hrb/btsg7IpT4w5/GzSUBPZZ2K7Bswvrk1cCUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/67Hrb/btsg7IpT4w5/GzSUBPZZ2K7Bswvrk1cCUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/67Hrb/btsg7IpT4w5/GzSUBPZZ2K7Bswvrk1cCUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F67Hrb%2Fbtsg7IpT4w5%2FGzSUBPZZ2K7Bswvrk1cCUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;597&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;line graph&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684851406296&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.plot.line(figsize = (15,5))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEUo8T/btshb7aj7Bp/UK0Qkk2pM7fT9ylKkw8zOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEUo8T/btshb7aj7Bp/UK0Qkk2pM7fT9ylKkw8zOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEUo8T/btshb7aj7Bp/UK0Qkk2pM7fT9ylKkw8zOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEUo8T%2Fbtshb7aj7Bp%2FUK0Qkk2pM7fT9ylKkw8zOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;303&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;bar graph&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684851619457&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.plot.bar(figsize = (15,5), grid=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8bGSZ/btshaUvNwVp/F3PKd9NbrwtLxz8Fk7b2Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8bGSZ/btshaUvNwVp/F3PKd9NbrwtLxz8Fk7b2Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8bGSZ/btshaUvNwVp/F3PKd9NbrwtLxz8Fk7b2Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8bGSZ%2FbtshaUvNwVp%2FF3PKd9NbrwtLxz8Fk7b2Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;305&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;area graph&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684851906353&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.plot.area(figsize = (15,5), xticks = (1,5,10,15,20), yticks = (1,2,3,4,5))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zSO9L/btsg838kUNy/yNeBs7t0PMJGBBpzOrVVJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zSO9L/btsg838kUNy/yNeBs7t0PMJGBBpzOrVVJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zSO9L/btsg838kUNy/yNeBs7t0PMJGBBpzOrVVJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzSO9L%2Fbtsg838kUNy%2FyNeBs7t0PMJGBBpzOrVVJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;307&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;b&gt;area graph ( &lt;/b&gt;Time index )&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1581957949741&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import pandas as pd
from datetime import datetime
from random import randint

data = [[ randint(50,1000)  for x in range(4) ] for x in range(4) ]
ix = [ datetime(2023,5,randint(1,10)) for x in range(4) ]

df = pd.DataFrame(data,
                  columns=['a','b','c', 'd'],
                  index=ix)

df.plot.area(figsize=(10,5))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xbbD2/btshasMHmJa/KwfNF1xvNao2aZFGeZTfK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xbbD2/btshasMHmJa/KwfNF1xvNao2aZFGeZTfK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xbbD2/btshasMHmJa/KwfNF1xvNao2aZFGeZTfK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxbbD2%2FbtshasMHmJa%2FKwfNF1xvNao2aZFGeZTfK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;303&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;sctter graph&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684853687230&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import pandas as pd

x = [ x for x in range(100) ]
y = [ randint(50,100) for x in range(100) ]

df = pd.DataFrame(zip(x, y), columns=['x','y'])

df.plot.scatter(x='x',y='y',
                s = 100,
                c = 'red',
                alpha=0.3)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v7EA2/btsg7GS8gbp/M8NyR7E0goZ7DRTDwlj0C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v7EA2/btsg7GS8gbp/M8NyR7E0goZ7DRTDwlj0C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v7EA2/btsg7GS8gbp/M8NyR7E0goZ7DRTDwlj0C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv7EA2%2Fbtsg7GS8gbp%2FM8NyR7E0goZ7DRTDwlj0C1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;337&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;파일저장은 matplotlib savefig를 이용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684854510159&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

plt.savefig('scatter.png')  # png
plt.savefig('scatter.pdf')  # pdf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciaxBw/btsg9MScW7A/bWzMOYnF0yctRJ86PP52z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciaxBw/btsg9MScW7A/bWzMOYnF0yctRJ86PP52z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciaxBw/btsg9MScW7A/bWzMOYnF0yctRJ86PP52z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciaxBw%2Fbtsg9MScW7A%2FbWzMOYnF0yctRJ86PP52z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;593&quot; height=&quot;49&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래프에 대한 옵션은 Document 를 참고 하면 되겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Document : &lt;a href=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html#&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684853895571&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;pandas.DataFrame.plot &amp;mdash; pandas 2.0.1 documentation&quot; data-og-description=&quot;sequence of iterables of column labels: Create a subplot for each group of columns. For example [(&amp;lsquo;a&amp;rsquo;, &amp;lsquo;c&amp;rsquo;), (&amp;lsquo;b&amp;rsquo;, &amp;lsquo;d&amp;rsquo;)] will create 2 subplots: one with columns &amp;lsquo;a&amp;rsquo; and &amp;lsquo;c&amp;rsquo;, and one with columns &amp;lsquo;b&amp;rsquo; and &amp;lsquo;d&amp;rsquo;. Remaining colum&quot; data-og-host=&quot;pandas.pydata.org&quot; data-og-source-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html#&quot; data-og-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;pandas.DataFrame.plot &amp;mdash; pandas 2.0.1 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;sequence of iterables of column labels: Create a subplot for each group of columns. For example [(&amp;lsquo;a&amp;rsquo;, &amp;lsquo;c&amp;rsquo;), (&amp;lsquo;b&amp;rsquo;, &amp;lsquo;d&amp;rsquo;)] will create 2 subplots: one with columns &amp;lsquo;a&amp;rsquo; and &amp;lsquo;c&amp;rsquo;, and one with columns &amp;lsquo;b&amp;rsquo; and &amp;lsquo;d&amp;rsquo;. Remaining colum&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pandas.pydata.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python For Analytics</category>
      <category>area graph</category>
      <category>pandas area graph</category>
      <category>pandas graph</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/370</guid>
      <comments>https://pydole.tistory.com/entry/Python-pandas-graph-area#entry370comment</comments>
      <pubDate>Wed, 24 May 2023 00:01:35 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] socket 모듈을 이용한 Port open / close check</title>
      <link>https://pydole.tistory.com/entry/python%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84-Port-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568040553273&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import socket
from datetime import datetime
import time

checkTime = str(datetime.today())[:19]
ipadd = '127.0.0.1'   # IP Address, string
port = 80             # Port Number, interger

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)

res = sock.connect_ex((ipadd, port))

text = str(port) + ' : ' + checkTime
print('Open ' + text if res == 0 else 'Close ' + text)


-------------------------------------------------------------

[ open ]

Open 22 : 2023-05-23 17:47:27



[ close ]

Close 80 : 2023-05-23 17:45:28&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>check</category>
      <category>port</category>
      <category>python socket</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/263</guid>
      <comments>https://pydole.tistory.com/entry/python%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84-Port-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81#entry263comment</comments>
      <pubDate>Tue, 23 May 2023 17:49:17 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용한 S3에 저장된 CSV 파일 읽기 / 쓰기</title>
      <link>https://pydole.tistory.com/entry/AWS-Boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-S3-log-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;CSV파일 S3에 다이렉트 저장하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sample : Pandas DataFrame ( 24 X 5 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btxg8y/btsg9MqiTvM/nkv8CUnCXXk58c1YVLBz0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btxg8y/btsg9MqiTvM/nkv8CUnCXXk58c1YVLBz0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btxg8y/btsg9MqiTvM/nkv8CUnCXXk58c1YVLBz0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtxg8y%2Fbtsg9MqiTvM%2Fnkv8CUnCXXk58c1YVLBz0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;102&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684821001701&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from io import StringIO
import boto3

s3 = boto3.client('s3')

bucket = 'string'        # Put Bucket Name
csv_buffer = StringIO()
df.to_csv(csv_buffer)
s3.put_object(Bucket=bucket, Body=csv_buffer.getvalue(), Key='df.csv')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG6wYA/btsg25ZaF4K/qJYsfL2qyyqgQbfR3rjvl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG6wYA/btsg25ZaF4K/qJYsfL2qyyqgQbfR3rjvl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG6wYA/btsg25ZaF4K/qJYsfL2qyyqgQbfR3rjvl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG6wYA%2Fbtsg25ZaF4K%2FqJYsfL2qyyqgQbfR3rjvl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;81&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;S3에 저장되어 있는 CSV파일 다이렉트 읽기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1658237494284&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3
import pandas as pd
import io

s3 = boto3.client('s3')

bucket = 'string'
obj = s3.get_object(Bucket=bucket, Key=&quot;df.csv&quot;)
df = pd.read_csv(io.BytesIO(obj[&quot;Body&quot;].read()))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CSV파일이나 정형화 되어 있는 Log 파일들을 S3로 바로 읽기/쓰기 바로바로 편집할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <category>CSV</category>
      <category>S3</category>
      <category>쓰기</category>
      <category>읽기</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/493</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-S3-log-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B8%B0#entry493comment</comments>
      <pubDate>Tue, 23 May 2023 14:56:50 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용한 EC2 Instance 정보 구하기</title>
      <link>https://pydole.tistory.com/entry/AWS-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-EC2-%EC%A0%95%EB%B3%B4-%EB%B3%B4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Python Boto3를 이용하여 EC2의 정보를 구해보자. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;ISMS 등 자산관리 및 EC2의 기본적인 모니터링을 할 때도 유용하게 사용할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1646570686388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3

ec2 = boto3.client('ec2')

def ec2_info_func():
    ec2_info = {}

    response = ec2.describe_instances()

    for reservation in response[&quot;Reservations&quot;]:
        for i in reservation[&quot;Instances&quot;]:
            for j in i['Tags']:
                # tagName이 없으면 'None'
                tagName = 'None'

                if j['Key'] == 'Name':
                    tagName = j['Value']
                
            ec2_info[i[&quot;InstanceId&quot;]] = [tagName,i['InstanceType'],i['State']['Name']]


    return ec2_info&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;pandas를 이용하여 보기 편하게 HTML 형태로 Output 해보자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684731693430&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

ec2s = ec2_info_func()

df = pd.DataFrame(ec2s.values(),index=ec2s.keys(),columns = ['TagName','InstanceType','Runnung State'])
df.to_html('ec2_info.html')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YMlL9/btsgEaghi4J/XFFfnliWkCFmybJCTTDyE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YMlL9/btsgEaghi4J/XFFfnliWkCFmybJCTTDyE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YMlL9/btsgEaghi4J/XFFfnliWkCFmybJCTTDyE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYMlL9%2FbtsgEaghi4J%2FXFFfnliWkCFmybJCTTDyE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;205&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;더 많은 ec2 정보를 구하려면 &amp;nbsp;&lt;b&gt;response[&quot;Reservations&quot;]&lt;/b&gt;&amp;nbsp; 데이터에서 Network, 옵션 등의 값을 더 추출할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <category>boto3</category>
      <category>EC2</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/476</guid>
      <comments>https://pydole.tistory.com/entry/AWS-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-EC2-%EC%A0%95%EB%B3%B4-%EB%B3%B4%EA%B8%B0#entry476comment</comments>
      <pubDate>Mon, 22 May 2023 14:10:05 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] pandas DataFrame을  HTML 형식으로 export 하기. (모니터링 활용)</title>
      <link>https://pydole.tistory.com/entry/Python-pandas-dataframe%EC%9D%84-HTML-%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C-export-%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;pandas의 to_html 메소드를 이용하여 DataFrame 결과를 HTML 형식으로 output&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;kor, math, eng 3개 컬럼의 기본 DataFrame 만들기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684315202690&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kor = [99, 53, 56, 56, 81, 90, 67, 68, 83, 55]
math = [91, 77, 59, 70, 100, 67, 89, 55, 93, 99]
eng = [96, 92, 92, 65, 51, 92, 55, 60, 54, 51]

import pandas as pd

df = pd.DataFrame(zip(kor,math,eng), columns=['kor','math','eng'])
df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yq9Kz/btsgl5Sc4dZ/84cWgg4lhLkpFJO5jsBjI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yq9Kz/btsgl5Sc4dZ/84cWgg4lhLkpFJO5jsBjI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yq9Kz/btsgl5Sc4dZ/84cWgg4lhLkpFJO5jsBjI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYq9Kz%2Fbtsgl5Sc4dZ%2F84cWgg4lhLkpFJO5jsBjI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;166&quot; height=&quot;357&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684315254853&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html = df.to_html()
print(html)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684315313228&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&amp;gt;
  &amp;lt;thead&amp;gt;
    &amp;lt;tr style=&quot;text-align: right;&quot;&amp;gt;
      &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;kor&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;math&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;eng&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/thead&amp;gt;
  &amp;lt;tbody&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;0&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;99&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;91&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;96&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;53&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;77&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;92&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;59&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;92&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;70&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;65&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;81&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;51&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;90&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;67&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;92&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;67&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;89&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;55&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;68&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;55&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;60&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;83&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;93&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;54&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;
      &amp;lt;td&amp;gt;55&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;99&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;51&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byNxeH/btsgmIbnsfR/TE7UX2khhFcnwL6d2Qi9F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byNxeH/btsgmIbnsfR/TE7UX2khhFcnwL6d2Qi9F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byNxeH/btsgmIbnsfR/TE7UX2khhFcnwL6d2Qi9F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyNxeH%2FbtsgmIbnsfR%2FTE7UX2khhFcnwL6d2Qi9F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;177&quot; height=&quot;386&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;HTML파일로 생성해 보자. ( test.html )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684575642546&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.to_html('test.html')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약, test.html 파일로 계속 갱신하여 모니터링 하려하면 아래와 같이 첫 line에 refresh 태그를 추가해 준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684577328703&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;text = '&amp;lt;meta http-equiv=&quot;refresh&quot; content=&quot;10&quot; &amp;gt;\n'

with open(&quot;test.html&quot;, &quot;r+&quot;) as f:
    s = f.read()
    f.seek(0)
    f.write(text + s)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특정 컬럼만 필터&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684510859591&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html = df.to_html(columns=['kor'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;65&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pSFAO/btsgDPhVNYG/TSKDkoPPNGvBb47i0QN5T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pSFAO/btsgDPhVNYG/TSKDkoPPNGvBb47i0QN5T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pSFAO/btsgDPhVNYG/TSKDkoPPNGvBb47i0QN5T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpSFAO%2FbtsgDPhVNYG%2FTSKDkoPPNGvBb47i0QN5T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;65&quot; height=&quot;314&quot; data-origin-width=&quot;65&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;컬럼 열 크기 변경&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684511229737&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html = df.to_html(col_space=[100,100,200])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mw8WE/btsgEfAD1dA/Wrlhs8dXmHGViYwloVQ7SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mw8WE/btsgEfAD1dA/Wrlhs8dXmHGViYwloVQ7SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mw8WE/btsgEfAD1dA/Wrlhs8dXmHGViYwloVQ7SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmw8WE%2FbtsgEfAD1dA%2FWrlhs8dXmHGViYwloVQ7SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;311&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최대 출력 수 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684511395680&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html = df.to_html(max_rows=2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;140&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX9OH9/btsgCjKHbF9/XcmIgLyhwBxSZlg2FOgkTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX9OH9/btsgCjKHbF9/XcmIgLyhwBxSZlg2FOgkTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX9OH9/btsgCjKHbF9/XcmIgLyhwBxSZlg2FOgkTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX9OH9%2FbtsgCjKHbF9%2FXcmIgLyhwBxSZlg2FOgkTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;140&quot; height=&quot;125&quot; data-origin-width=&quot;140&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Document : &lt;a href=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_html.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_html.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684575968329&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;pandas.DataFrame.to_html &amp;mdash; pandas 2.0.1 documentation&quot; data-og-description=&quot;next pandas.io.formats.style.Styler.to_html&quot; data-og-host=&quot;pandas.pydata.org&quot; data-og-source-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_html.html&quot; data-og-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_html.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_html.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_html.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;pandas.DataFrame.to_html &amp;mdash; pandas 2.0.1 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;next pandas.io.formats.style.Styler.to_html&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pandas.pydata.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/523</guid>
      <comments>https://pydole.tistory.com/entry/Python-pandas-dataframe%EC%9D%84-HTML-%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C-export-%ED%95%98%EA%B8%B0#entry523comment</comments>
      <pubDate>Wed, 17 May 2023 18:22:16 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용하여 WAF IPset IP 수정하기</title>
      <link>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-WAF-IPset-IP-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Python Boto3를 이용한 WAF IPset에 IP Address 추가&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;* 하나의 IP를 추가/삭제는 않되기 때문에, 기존 IP 리스트를 가져와서 수정하는 것&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684222671462&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3

client = boto3.client('wafv2')

ipsetName = 'string'
ipsetId = 'string'
ipAddress = 'x.x.x./32'

def wafv2_update_ip_set(n,i,a):

    # ip가 포함되어 있는지 get_ip_set으로 확인
    response = client.get_ip_set(
            Name=n,
            Scope='REGIONAL',
            Id=i)

    if a in response['IPSet']['Addresses']:
        return 'exist ipaddress'
        
    else:
        # ip가 포함되어 있지 않으면 기존 IPset IP에 추가
        ipset_ipaddrs = response['IPSet']['Addresses']
        ipset_ipaddrs.append(a)
        
        response = client.update_ip_set(
                Name=n,
                Scope='REGIONAL',
                Id=i,
                Addresses=ipset_ipaddrs,             # list data
                LockToken=response['LockToken'])     # LockToken값은 get_ip_set에서 득한다.
                
        # 응답값 리턴 : 200 정상
        return response['ResponseMetadata']['HTTPStatusCode']

print(wafv2_update_ip_set(ipsetName,ipsetId,ipAddress))



200&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정상적으로 추가되면, 200응답코드를 리턴해주고, 아래와 같이 추가된 IP와 함께 수정된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X4JU7/btsgcLe9Uk8/akveVy0xpmc4TUGNz970G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X4JU7/btsgcLe9Uk8/akveVy0xpmc4TUGNz970G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X4JU7/btsgcLe9Uk8/akveVy0xpmc4TUGNz970G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX4JU7%2FbtsgcLe9Uk8%2FakveVy0xpmc4TUGNz970G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;214&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;FastAPI와 같이&amp;nbsp;&lt;/span&gt;API로도 활용해도 괜찬겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coOiQm/btsg0N4Cfvo/z0k4KFZTKK20Qc8AipwAy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coOiQm/btsg0N4Cfvo/z0k4KFZTKK20Qc8AipwAy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coOiQm/btsg0N4Cfvo/z0k4KFZTKK20Qc8AipwAy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoOiQm%2Fbtsg0N4Cfvo%2Fz0k4KFZTKK20Qc8AipwAy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;78&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Document : &lt;a href=&quot;https://boto3.amazonaws.com/v1/documentation/api/1.18.27/reference/services/wafv2.html#WAFV2.Client.update_ip_set&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://boto3.amazonaws.com/v1/documentation/api/1.18.27/reference/services/wafv2.html#WAFV2.Client.update_ip_set&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684225890845&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;WAFV2 &amp;mdash; Boto3 Docs 1.18.27 documentation&quot; data-og-description=&quot;ResourceArn (string) -- [REQUIRED] The Amazon Resource Name (ARN) of the web ACL from which you want to delete the LoggingConfiguration .&quot; data-og-host=&quot;boto3.amazonaws.com&quot; data-og-source-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/1.18.27/reference/services/wafv2.html#WAFV2.Client.update_ip_set&quot; data-og-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/1.18.27/reference/services/wafv2.html#WAFV2.Client.update_ip_set&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://boto3.amazonaws.com/v1/documentation/api/1.18.27/reference/services/wafv2.html#WAFV2.Client.update_ip_set&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/1.18.27/reference/services/wafv2.html#WAFV2.Client.update_ip_set&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;WAFV2 &amp;mdash; Boto3 Docs 1.18.27 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ResourceArn (string) -- [REQUIRED] The Amazon Resource Name (ARN) of the web ACL from which you want to delete the LoggingConfiguration .&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;boto3.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <category>boto3</category>
      <category>ipset</category>
      <category>wafv2</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/522</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-WAF-IPset-IP-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0#entry522comment</comments>
      <pubDate>Tue, 16 May 2023 17:28:06 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] csv 파일 읽고, 쓰기 ( pandas / csv 모듈 )</title>
      <link>https://pydole.tistory.com/entry/Python-pandas-csv-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B3%A0-%EC%93%B0%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터를 처리하다 보면 csv 파일 자주 만나게 되는데, Python pandas와 csv 모듈로 처리할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;파이썬&amp;nbsp;pandas csv 파일 읽고, 쓰기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;샘플데이터 : example.csv (UTF-8)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;=============================&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;Student&quot;,&quot;Math&quot;,&quot;Computer&quot;,&quot;English&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;인호&quot;,90,85,100&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;철수&quot;,85,100,95&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;영희&quot;,75,70,85&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;민수&quot;,95,85,90&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;지훈&quot;,100,85,95&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;지영&quot;,90,85,90&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;정희&quot;,95,85,95&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;=============================&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;pandas의 read_csv 메소드로 csv 파일 읽기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684212201518&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv(r'C:\Python\SC\example.csv')
print(df)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;lsl&quot; style=&quot;background-color: #ffffff;&quot;&gt;&lt;code&gt;  Student  Math  Computer  English
0      인호    90        85      100
1      철수    85       100       95
2      영희    75        70       85
3      민수    95        85       90
4      지훈   100        85       95
5      지영    90        85       90
6      정희    95        85       95&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;names 옵션으로 컬럼명 지정하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; style=&quot;background-color: #ffffff; font-family: 나눔고딕코딩; font-size: 11.3pt;&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv(r'C:\Python\SC\example.csv', skiprows=[0], names=['학생', '수학', '컴퓨터', '영어'])
print(df)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;* sample.csv의 경우 &lt;span style=&quot;text-align: start;&quot;&gt;&quot;Student&quot;,&quot;Math&quot;,&quot;Computer&quot;,&quot;English&quot;이 포함되어 있기 때문에, skiprows로 제외&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1569500085861&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   학생   수학  컴퓨터   영어
0  인호   90   85  100
1  철수   85  100   95
2  영희   75   70   85
3  민수   95   85   90
4  지훈  100   85   95
5  지영   90   85   90
6  정희   95   85   95&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;pandas의 read_csv 메소드로 export&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684212587990&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv(r'C:\Python\SC\example.csv', skiprows=[0], names=['학생', '수학', '컴퓨터', '영어'])
df.to_csv(r'C:\Python\SC\result.csv', index=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;* index=False : index는 제외&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684212940134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import csv

f = open('sample.csv')
rows = csv.reader(f)
f.close

for row in rows:
    print(row)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684212958105&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;['Student', 'Math', 'Computer', 'English']
['인호', '90', '85', '100']
['철수', '85', '100', '95']
['영희', '75', '70', '85']
['민수', '95', '85', '90']
['지훈', '100', '85', '95']
['지영', '90', '85', '90']
['정희', '95', '85', '95']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python For Analytics</category>
      <category>CSV</category>
      <category>pandas</category>
      <category>pandas read csv</category>
      <category>pandas writes csv</category>
      <category>PYTHON</category>
      <category>python pandas</category>
      <category>데이터 분석</category>
      <category>파이썬</category>
      <category>파이썬 pandas csv 쓰기</category>
      <category>파이썬 pandas csv 읽기</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/82</guid>
      <comments>https://pydole.tistory.com/entry/Python-pandas-csv-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B3%A0-%EC%93%B0%EA%B8%B0#entry82comment</comments>
      <pubDate>Tue, 16 May 2023 14:08:09 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] 리눅스 mpstat 유틸을 이용한 CPU  Core별 통계 뽑기. (평균값, 최대값, 최소값)</title>
      <link>https://pydole.tistory.com/entry/mpstat%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-CPU-%ED%86%B5%EA%B3%84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Datebase CPU Core 증설작업 후 Core별로 CPU가 모두 활동하는지 확인해볼 필요가 생겼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리눅스의 mpstat는 Core 별 사용량을 모니터링할 수 있다. 결과를 파일로 export 하고, Python을 하여 DataFrame화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하려 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DataFrame 하게 되면 DB, NoSQL 등에 저장하여 통계적으로 활용할 수 있겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #f6e199;&quot;&gt;목표 : 리눅스의 mpstat 유틸과 python을 이용하여 Core 별 통계 추출&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;mpstat 명령어를 이용한 데이터 수집 ( 파일 리다이랙션 )&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638177107677&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1초간격으로 모든 CPU Core 사용량을 추출 (리눅스 명령)
# Output File : cpu_result_final.txt

mpstat -P ALL 1 &amp;gt;&amp;gt; cpu_result_final.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;%usr은 어플리케이션에서 사용되는 CPU 사용율을 볼 수 있는데, 이 지표를 활용해 보기로 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUfGy8/btrmopZBfER/11su4aL9oQGZSUNh7ukF01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUfGy8/btrmopZBfER/11su4aL9oQGZSUNh7ukF01/img.png&quot; data-alt=&quot;16core mpstat 실행 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUfGy8/btrmopZBfER/11su4aL9oQGZSUNh7ukF01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUfGy8%2FbtrmopZBfER%2F11su4aL9oQGZSUNh7ukF01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;340&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;16core mpstat 실행 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;수집하고 시간만큼 파일에 저장하고, Python으로 전처리 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638179975130&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파일을 열어 라인별로 리스트 변환
# readlines() : 라인별로 읽어 리스트로 변환하는 메소드

with open('cpu_result_final.txt') as f:
    lines = f.readlines()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638179982775&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 공백을 split하여 리스트 요소가 13인 것만 추출 (CPU, all이 포함된 문자열은 제외)
# 사전 형태로 생성하는데, Core는 Key가 되고, %usr은 Value 값이 되어 리스트에 계속 append

dct = {}

for i in lines:
    i = i.split()
    
    if len(i) == 13:  
        if 'CPU' in i:
            pass
    
        elif 'all' in i:
            pass
    
        else:
            if i[2] not in dct:
                dct[i[2]] = [float(i[3])]
            else:
                dct[i[2]] += [float(i[3])]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638179998879&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Option : DataFrame에서 소숫점 2자리 표현. (굳이 소숫점을 5자리 이상 길게 할 필요는 없다)
# 위에서 생성한 딕셔너리(dct)를 DataFrame으로 변환

import pandas as pd

pd.options.display.float_format = '{:.2f}'.format

dct = { 'cpu_' + x : y for x, y in dct.items() } 
df = pd.DataFrame(dct)
df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cft5oG/btrmrufFOb6/5stkQP2eHRKT4GXaZWDky0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cft5oG/btrmrufFOb6/5stkQP2eHRKT4GXaZWDky0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cft5oG/btrmrufFOb6/5stkQP2eHRKT4GXaZWDky0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcft5oG%2FbtrmrufFOb6%2F5stkQP2eHRKT4GXaZWDky0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;839&quot; height=&quot;345&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638180045039&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 평균, 최대값, 최소값을 구해서 맨 마지막열에 추가
# 숫자 index 이름을 알맞게 변경



meanvalue = df.mean().to_dict()
df = df.append(meanvalue, ignore_index=True)

maxvalue = df.max().to_dict()
df = df.append(maxvalue, ignore_index=True)

minvalue = df.min().to_dict()
df = df.append(minvalue, ignore_index=True)

df = df.rename(index = {4720:'평균'})
df = df.rename(index = {4721:'최대값'})
df = df.rename(index = {4722:'최소값'})
df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sRRhn/btrmxL8dG2T/nlK4lCi6sTqj09rrto5faK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sRRhn/btrmxL8dG2T/nlK4lCi6sTqj09rrto5faK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sRRhn/btrmxL8dG2T/nlK4lCi6sTqj09rrto5faK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsRRhn%2FbtrmxL8dG2T%2FnlK4lCi6sTqj09rrto5faK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;352&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python for Linux</category>
      <category>core 별 통계</category>
      <category>cpu 통계</category>
      <category>mpstat 활용</category>
      <category>PYTHON</category>
      <category>리눅스 cpu별 통계</category>
      <category>리눅스 파이썬 활용</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/456</guid>
      <comments>https://pydole.tistory.com/entry/mpstat%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-CPU-%ED%86%B5%EA%B3%84#entry456comment</comments>
      <pubDate>Sun, 14 May 2023 22:39:43 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ]  웹 서버 날짜 확인 하기</title>
      <link>https://pydole.tistory.com/entry/Python-%EC%9B%B9-%EC%84%9C%EB%B2%84-%EB%82%A0%EC%A7%9C-%ED%99%95%EC%9D%B8-%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;header 정보에서 날짜 추출하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684038774979&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import urllib.request

url = 'web domain'
date = urllib.request.urlopen(url).headers['Date']
print(date)


Sun, 14 May 2023 04:32:47 GMT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;한국시간 GMT +0900으로 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684038800513&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import datetime
from datetime import timedelta

date = date.rstrip(' GMT')[5:]
date = datetime.strptime(date, '%d %b %Y %H:%M:%S') + timedelta(hours=9)
print(date)

2023-05-14 13:31:17&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/521</guid>
      <comments>https://pydole.tistory.com/entry/Python-%EC%9B%B9-%EC%84%9C%EB%B2%84-%EB%82%A0%EC%A7%9C-%ED%99%95%EC%9D%B8-%ED%95%98%EA%B8%B0#entry521comment</comments>
      <pubDate>Sun, 14 May 2023 13:35:19 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] ntplib 모듈을 이용한 시간 동기화 점검</title>
      <link>https://pydole.tistory.com/entry/Python-ntplib-%EB%AA%A8%EB%93%88%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%9C%EA%B0%84-%EB%8F%99%EA%B8%B0%ED%99%94-%EC%A0%90%EA%B2%80</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;ntplib 모듈설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684038155295&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install ntplib&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;NTP서버와 로컬간의 offset 체크&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1569580434182&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import ntplib 
from time import ctime 

timeServer = 'time.windows.com'               # NTP Server Domain Or IP 
c = ntplib.NTPClient() 
response = c.request(timeServer, version=3) 
print('NTP Server Time과 Local Time과 차이는 %.2f s입니다.' %response.offset)

--------------------------------------------------------------------

NTP Server Time과 Local Time과 차이는 0.71 s입니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;NTP 서버시간 타임 스탬프로 출력&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1569580447453&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import ntplib 
from time import ctime 

timeServer = 'time.windows.com'               # NTP Server Domain Or IP 
c = ntplib.NTPClient() 
response = c.request(timeServer, version=3) 
print(ctime(response.tx_time))



---------------------------------------------------------------------


Mon May 21 11:20:51 2018&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>NTP</category>
      <category>PYTHON</category>
      <category>python ntp</category>
      <category>python ntp 모듈</category>
      <category>python 시간 동기화</category>
      <category>시간 동기화</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/123</guid>
      <comments>https://pydole.tistory.com/entry/Python-ntplib-%EB%AA%A8%EB%93%88%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%9C%EA%B0%84-%EB%8F%99%EA%B8%B0%ED%99%94-%EC%A0%90%EA%B2%80#entry123comment</comments>
      <pubDate>Sun, 14 May 2023 13:22:15 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] numpy를 이용한 1차원 배열 2 차원 배열로 변환</title>
      <link>https://pydole.tistory.com/entry/Python-numpy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-1%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-2-%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%B3%80%ED%99%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;list 데이터를 처리하다 보면, 1차원 배열을 2차원 배열로 변경해야할 때가 있는데, numpy를 이용하면 쉽게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;reshape : 데이터를 변동시키지 않고, 새로운 배열을 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683866880060&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np

# 3 X 10

a = [ x for x in range(30) ]
a = np.array(a)

a = a.reshape(10,3) # (2차원 원소수, 원소당 갯수)

print(a)



array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20],
       [21, 22, 23],
       [24, 25, 26],
       [27, 28, 29]])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683868598579&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 5 X 6


a = a.reshape(6,5)
print(a)



[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]
 [25 26 27 28 29]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;ndarray.&lt;/span&gt;tolist() : numpy array 형식을 list 형식으로&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683867189228&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(a.tolist())

-----------------------------

[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/520</guid>
      <comments>https://pydole.tistory.com/entry/Python-numpy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-1%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-2-%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%B3%80%ED%99%98#entry520comment</comments>
      <pubDate>Fri, 12 May 2023 14:07:58 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용하여 RDS Connections 데이터 추출 하기</title>
      <link>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-RDS-CPU-Connections-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B6%94%EC%B6%9C-%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683771997919&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3
from datetime import datetime
from datetime import timedelta

cloudwatch = boto3.client('cloudwatch')  

def rds_connections():
    StartTime = datetime(2023,5,1) - timedelta(hours=9)   
    # 한국시간에 맞게 -0900
    # 한국기준으로 5월 1일로 지정해줬기 때문에, UTC는 4월 30일 15시 데이터 추출한다.
    
    EndTime = StartTime + timedelta(days=1)


    response = cloudwatch.get_metric_statistics(
            Namespace='AWS/RDS',
            MetricName='DatabaseConnections',
            Dimensions=[
                { 
                 'Name': 'DBInstanceIdentifier',
                 'Value': 'string'},       # 추출할 RDS 식별자 Name을 넣어준다
                ],
            StartTime=StartTime,
            EndTime=EndTime,
            Period=600,
            Statistics=['Average'],
            Unit='Count')

    return response['Datapoints']

dct = {}

for i in rds_connections():
    dct[i['Timestamp'] + timedelta(hours=9)] = i['Average']
    # 출력되는 데이터는 한국시간으로 변환 UTC +0900

for k, v in sorted(dct.items()):
    print(str(k)[:19], v)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683772081472&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2023-05-01 00:00:00 90.0
2023-05-01 00:10:00 90.1
2023-05-01 00:20:00 90.0
2023-05-01 00:30:00 90.0
2023-05-01 00:40:00 90.0
2023-05-01 00:50:00 90.1
2023-05-01 01:00:00 90.0
2023-05-01 01:10:00 90.1
2023-05-01 01:20:00 90.1
2023-05-01 01:30:00 90.1
2023-05-01 01:40:00 90.1

...
...
...

2023-05-01 21:50:00 100.1
2023-05-01 22:00:00 100.1
2023-05-01 22:10:00 100.3
2023-05-01 22:20:00 100.0
2023-05-01 22:30:00 100.0
2023-05-01 22:40:00 100.1
2023-05-01 22:50:00 100.0
2023-05-01 23:00:00 100.1
2023-05-01 23:10:00 100.1
2023-05-01 23:20:00 100.0
2023-05-01 23:30:00 100.2
2023-05-01 23:40:00 100.0
2023-05-01 23:50:00 100.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <category>boto3</category>
      <category>CloudWatch</category>
      <category>RDS</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/519</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-RDS-CPU-Connections-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B6%94%EC%B6%9C-%ED%95%98%EA%B8%B0#entry519comment</comments>
      <pubDate>Thu, 11 May 2023 11:30:47 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용하여 ELB Metric 모니터링</title>
      <link>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-ELB-Metric-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Python Boto3를 이용하여&amp;nbsp; ELB 2XX Count 통계를 추출해보고, 효율적으로 모니터링해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;메소드는 &lt;span style=&quot;color: #409d00;&quot;&gt;cloudwatch.get_metric_statistics&lt;/span&gt;이용하고, MetricName은 &lt;span style=&quot;color: #409d00;&quot;&gt;HTTPCode_Target_2XX_Count &lt;span style=&quot;color: #000000;&quot;&gt;을 사용하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ELB 콘솔 cloudwatch에서도 아래지표와 같이 볼 수 있는데, 이 데이터를 Python으로 추출해보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkkhww/btsey3XLSj4/fpi1GF5oyt8UMgVMr7Itgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkkhww/btsey3XLSj4/fpi1GF5oyt8UMgVMr7Itgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkkhww/btsey3XLSj4/fpi1GF5oyt8UMgVMr7Itgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkkhww%2Fbtsey3XLSj4%2Ffpi1GF5oyt8UMgVMr7Itgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;250&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683695579056&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import datetime
from datetime import timedelta

cloudwatch = boto3.client('cloudwatch')  

elb = 'string'   # elb의 arn의 app이하 부분부터 넣어주면 된다.


def elb_2XX_Count(elb):
    response = cloudwatch.get_metric_statistics(
            Namespace='AWS/ApplicationELB',
            MetricName='HTTPCode_Target_2XX_Count',
            Dimensions=[
                {
                 'Name': 'LoadBalancer',
                 'Value': elb},
                ],
            StartTime=datetime.today() - timedelta(days=1),
            EndTime=datetime.today(),
            Period=300,                   # Second
            Statistics=['Sum'],
            Unit='Count')

    return response['Datapoints']

dct = {}


# 기본적으로 UTC로 추출되기 때문에, 서울시간으로 변경하고, 시간순으로 정렬한다.

for value in elb_2XX_Count(elb):
    dct[value['Timestamp'] + timedelta(hours=9)] = value['Sum']

for t, v in sorted(dct.items()):
    print(str(t)[:16], '\t', v )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;600초 주기로 하였기 때문에, 5분 SUM 통계로 추출되어 진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683695837361&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2023-05-09 23:11 	 884.0
2023-05-09 23:16 	 771.0
2023-05-09 23:21 	 695.0
2023-05-09 23:26 	 623.0
2023-05-09 23:31 	 575.0
2023-05-09 23:36 	 564.0
2023-05-09 23:41 	 544.0
2023-05-09 23:46 	 489.0
2023-05-09 23:51 	 522.0
2023-05-09 23:56 	 438.0
2023-05-10 00:01 	 650.0

...
...
...

2023-05-10 13:11 	 381.0
2023-05-10 13:16 	 490.0
2023-05-10 13:21 	 524.0
2023-05-10 13:26 	 636.0
2023-05-10 13:31 	 798.0
2023-05-10 13:36 	 769.0
2023-05-10 13:41 	 643.0
2023-05-10 13:46 	 514.0
2023-05-10 13:51 	 596.0
2023-05-10 13:56 	 559.0
2023-05-10 14:01 	 840.0
2023-05-10 14:06 	 647.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/518</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-ELB-Metric-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81#entry518comment</comments>
      <pubDate>Wed, 10 May 2023 14:14:04 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] 날짜형식의 문자열 타입을 datetime 타입 형식으로 변환</title>
      <link>https://pydole.tistory.com/entry/Python-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EB%82%A0%EC%A7%9C%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Database, logs 등 날짜형식 데이터를 Python으로 불러와서 처리할 때, 문자열로 저장되게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Python에서 날짜 데이터를 이용하여 그래프를 그리거나 연산을 하기 위해서는 형 변환이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;datime.datetime.strptime : date 문자열을 datetime 형식으로 변환&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566557062467&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from datetime import datetime

strtype = '2018-09-15 00:01:14'
print(type(strtype))

logdate = datetime.strptime(strtype, '%Y-%m-%d %H:%M:%S')
print(type(logdate))
print(logdate)


-------------------------------------------------------------------------------
&amp;lt;class 'str'&amp;gt; 
&amp;lt;class 'datetime.datetime'&amp;gt; 
2018-09-15 00:01:14&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;list comprehension 을 이용한 일괄 변경&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684036758720&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import datetime

dates = ['2018-09-15 00:01:14','2018-09-16 00:01:14','2018-09-17 00:01:14','2018-09-18 00:01:14','2018-09-19 00:01:14',
         '2018-09-20 00:01:14','2018-09-21 00:01:14','2018-09-22 00:01:14','2018-09-23 00:01:14']

dates = [ datetime.strptime(x, '%Y-%m-%d %H:%M:%S') for x in dates ]



[datetime.datetime(2018, 9, 15, 0, 1, 14),
 datetime.datetime(2018, 9, 16, 0, 1, 14),
 datetime.datetime(2018, 9, 17, 0, 1, 14),
 datetime.datetime(2018, 9, 18, 0, 1, 14),
 datetime.datetime(2018, 9, 19, 0, 1, 14),
 datetime.datetime(2018, 9, 20, 0, 1, 14),
 datetime.datetime(2018, 9, 21, 0, 1, 14),
 datetime.datetime(2018, 9, 22, 0, 1, 14),
 datetime.datetime(2018, 9, 23, 0, 1, 14)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;비교 연산자를 이용하여 날짜 비교&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683092806580&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;datetime.today() &amp;gt; logdate
--------------------------------------
True


datetime.today() &amp;lt; logdate
--------------------------------------
False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;과거와 미래날짜 구하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1683093058659&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import timedelta


# 전일 날짜 구하기
logdate - timedelta(days=1) 
------------------------------------
2018-09-14 00:01:14


# 10일후 날짜 구하기
logdate + timedelta(days=10)
------------------------------------
2018-09-25 00:01:14&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Document&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://docs.python.org/3/library/datetime.html?highlight=strptime#datetime.datetime.strptime&quot;&gt;https://docs.python.org/3/library/datetime.html?highlight=strptime#datetime.datetime.strptime&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684036135521&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;datetime &amp;mdash; Basic date and time types&quot; data-og-description=&quot;Source code: Lib/datetime.py The datetime module supplies classes for manipulating dates and times. While date and time arithmetic is supported, the focus of the implementation is on efficient attr...&quot; data-og-host=&quot;docs.python.org&quot; data-og-source-url=&quot;https://docs.python.org/3/library/datetime.html?highlight=strptime#datetime.datetime.strptime&quot; data-og-url=&quot;https://docs.python.org/3/library/datetime.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jO4hO/hySCTlyCm4/2IMSkmexP9ZlrNHGZlfen1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://docs.python.org/3/library/datetime.html?highlight=strptime#datetime.datetime.strptime&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.python.org/3/library/datetime.html?highlight=strptime#datetime.datetime.strptime&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jO4hO/hySCTlyCm4/2IMSkmexP9ZlrNHGZlfen1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;datetime &amp;mdash; Basic date and time types&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Source code: Lib/datetime.py The datetime module supplies classes for manipulating dates and times. While date and time arithmetic is supported, the focus of the implementation is on efficient attr...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.python.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>datetime strptime</category>
      <category>PYTHON</category>
      <category>python datetime</category>
      <category>python string to datetime</category>
      <category>python 날짜타입</category>
      <category>strings to datatime</category>
      <category>strings to datetime</category>
      <category>strptime</category>
      <category>문자열 날짜</category>
      <category>파이썬 날짜형식</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/166</guid>
      <comments>https://pydole.tistory.com/entry/Python-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EB%82%A0%EC%A7%9C%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD#entry166comment</comments>
      <pubDate>Wed, 3 May 2023 14:55:15 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용하여 Target Group Health 모니터링</title>
      <link>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-Target-Group-Health-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682393249386&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import boto3

client = boto3.client('elbv2')                     

response = client.describe_target_health(
    TargetGroupArn='string'
)

for i in response['TargetHealthDescriptions']:
    print(i['TargetHealth']['State'])
    
-----------------------------------------------
healthy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;. 비정상일 경우 : 'unhealthy', &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;'unused'&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682394707542&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(i['TargetHealth']['State'],i['TargetHealth']['Description'])
------------------------------------------------------------------
unhealthy Health checks failed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682394438502&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(i['TargetHealth']['State'],i['TargetHealth']['Description'])
------------------------------------------------------------------
unused Target is in the stopped state&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위와 같이 'State' 에서 상태 값으로 조건 테스트 후 ['Target']['Id'] 를 통하여 2차적인 액션을 취하면 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/517</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-Target-Group-Health-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81#entry517comment</comments>
      <pubDate>Tue, 25 Apr 2023 12:31:38 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] xml 타입의 데이터 json 으로 변경</title>
      <link>https://pydole.tistory.com/entry/Python-xml-%EB%8D%B0%EC%9D%B4%ED%84%B0-json-%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;xmltodict 모듈설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682309908475&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install xmltodict&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;xml sample&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85)&quot;&gt;https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85)&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682309998591&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Sample XML File (books.xml)&quot; data-og-description=&quot;Table of contents Sample XML File (books.xml) Article 10/27/2016 In this article --&amp;gt; The following XML file is used in various samples throughout the Microsoft XML Core Services (MSXML) SDK. Gambardella, Matthew XML Developer's Guide Computer 44.95 2000-10&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85)&quot; data-og-url=&quot;https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85)&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5ImUJ/hySoAtkyPh/6gutE60cvyMH7Y5tv9opKK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85)&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b5ImUJ/hySoAtkyPh/6gutE60cvyMH7Y5tv9opKK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Sample XML File (books.xml)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Table of contents Sample XML File (books.xml) Article 10/27/2016 In this article --&amp;gt; The following XML file is used in various samples throughout the Microsoft XML Core Services (MSXML) SDK. Gambardella, Matthew XML Developer's Guide Computer 44.95 2000-10&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;xml 데이터를 dictionary (json) 타입으로 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1650012439499&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import json
import xmltodict

with open('sample.xml', encoding='utf-8') as f:
    doc = xmltodict.parse(f.read())
                          
json_data = json.loads(json.dumps(doc))
print(json_data)

----------------------------------------------------------------

{'catalog': {'book': [{'@id': 'bk101',
    'author': 'Gambardella, Matthew',
    'title': &quot;XML Developer's Guide&quot;,
    'genre': 'Computer',
    'price': '44.95',
    'publish_date': '2000-10-01',
    'description': 'An in-depth look at creating applications \n      with XML.'},
   {'@id': 'bk102',
    'author': 'Ralls, Kim',
    'title': 'Midnight Rain',
    'genre': 'Fantasy',
    'price': '5.95',
    'publish_date': '2000-12-16',
    
 .............
 .............&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>Python XML</category>
      <category>xml json</category>
      <category>xml to json</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/488</guid>
      <comments>https://pydole.tistory.com/entry/Python-xml-%EB%8D%B0%EC%9D%B4%ED%84%B0-json-%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD#entry488comment</comments>
      <pubDate>Mon, 24 Apr 2023 13:21:43 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] difflib 모듈 ( 문자열 비교, 유사도 )</title>
      <link>https://pydole.tistory.com/entry/Python-%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;difflib.SequenceMatcher ( 유사도 )&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682304001509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from difflib import SequenceMatcher

def similar(a, b):
    return round(float(SequenceMatcher(None, a, b).ratio()),2) * 100

print(similar('서울시 강남구','서울시 영등포구 '))

-----------------------------------------------------------------------

62.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;difflib.context_diff ( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;문자열 목록 비교 )&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 140px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;samplefile_1.txt&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;samplefile_2.txt&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 120px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 120px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;1 파이썬 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;2 python &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;3 iz &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;4 beautiful&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 120px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;1 파이선 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;2 python &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;3 is &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;4 beautiful &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;5&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;6 diff&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1570678272862&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from difflib import context_diff

with open('samplefile_1.txt', 'r') as f1:
    with open('samplefile_2.txt', 'r') as f2:
        diff = context_diff(f1.readlines(), f2.readlines(), fromfile='f1', tofile='f2')
        for line in diff:
            print(line)
            
------------------------------------------------------------------------------------------
*** f1 

--- f2 

*************** 

*** 1,4 **** 

! 파이썬 

  python 

! iz 

  beautiful 

--- 1,6 ---- 

! 파이선                    # file1과 file2 1 line 다른점

  python 

! is                        # file1과 file2 3 line 다른점

  beautiful 

+  
                            # file2만 있는 내용
+ diff                      # file2만 있는 내용

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>diff</category>
      <category>difflib</category>
      <category>PYTHON</category>
      <category>유사도</category>
      <category>텍스트 파일 비교</category>
      <category>파이썬</category>
      <category>파이썬 파일 비교</category>
      <category>파일 비교</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/282</guid>
      <comments>https://pydole.tistory.com/entry/Python-%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0#entry282comment</comments>
      <pubDate>Mon, 24 Apr 2023 11:42:28 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] elastcisearch index 생성, 삭제, 조회</title>
      <link>https://pydole.tistory.com/entry/Python-elastcisearch-index-%EC%83%9D%EC%84%B1-%EC%82%AD%EC%A0%9C-%EC%A1%B0%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Python ElasticSearch&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681456413294&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from elasticsearch import Elasticsearch

es = Elasticsearch('http://127.0.0.1:9200')
ix = ix_name        # string&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Search All Index&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681443892812&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for index in es.indices.get('*'):
    print(index)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Create Index&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681456286761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 3 shards, 1 replicas

body={&quot;settings&quot; : {&quot;index&quot; : {&quot;number_of_shards&quot; : 3,&quot;number_of_replicas&quot; : 1 }}}
res = es.indices.create(index=ix, body=mapping)
print(res)

-----------------------------------------------------------------------------------
True or False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Index Exists&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681445778541&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res = es.indices.exists(index=ix)
print(res)

-------------------------------------------------
True or False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Delete Index&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681446046873&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res = es.indices.delete(index=ix, ,ignore=[400, 404])
print(res)

-------------------------------------------------
True or False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/515</guid>
      <comments>https://pydole.tistory.com/entry/Python-elastcisearch-index-%EC%83%9D%EC%84%B1-%EC%82%AD%EC%A0%9C-%EC%A1%B0%ED%9A%8C#entry515comment</comments>
      <pubDate>Fri, 14 Apr 2023 13:27:27 +0900</pubDate>
    </item>
    <item>
      <title>[ Python ] Remine API 사용하기</title>
      <link>https://pydole.tistory.com/entry/Python-Remine-API-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Redmine Python을 이용하면 일감관리, 노트관리, 뉴스 등을 자동화하거나 다른 서비스와 연동할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;모듈설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679378008205&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install python-redmine&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;접근방법은 &quot;User / Password&quot;와 &quot;API Key&quot; 인증 2가지가 있다. API Key를 허용하는 방법은 글 하단에 표기하였다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679390569910&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;redmine = Redmine('url', username=' ', password=' ')

redmine = Redmine('url', key=' ')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;신규 일감(Issue) 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679639084587&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from redminelib import Redmine
import datetime

redmine = Redmine('url', key=' ')

issue = redmine.issue.create(
    project_id=' ',     # 필수
    subject=' ',        # 필수
    description='',     # 옵션
    start_date = datetime.date(2023,4,13),  # 옵션
    due_date = datetime.date(2023,4,14))    # 옵션
    uploads = [{'path': /dir/uploadfile,'filename':uploadfile}])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;노트(Note) 업데이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679377699461&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from redminelib import Redmine

def remine_job(job_num,msg):
    redmine = Redmine('url', key='')
    issue = redmine.issue.update(job_num, notes=msg)

    return issue

msg = '''
Note Test
'''

remine_func(job_num,msg)  # job_num (int)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;뉴스(News) 업데이트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679386611327&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from redminelib import Redmine

def remine_func(subject,msg):
    redmine = Redmine('url', key=' ')
    news = redmine.news.create(project_id=' ', title=subject, description=msg)    
    return news

subject = '[NEWS] Test'
msg = '''
New Test
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;API 허용하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IvW8T/btr41I2GrA1/V5SLzzA6tlS6iXk5re7jA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IvW8T/btr41I2GrA1/V5SLzzA6tlS6iXk5re7jA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IvW8T/btr41I2GrA1/V5SLzzA6tlS6iXk5re7jA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIvW8T%2Fbtr41I2GrA1%2FV5SLzzA6tlS6iXk5re7jA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;175&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEZonk/btr45i3eUVH/ky8iAZ9Hc1mZK5QoB9MJH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEZonk/btr45i3eUVH/ky8iAZ9Hc1mZK5QoB9MJH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEZonk/btr45i3eUVH/ky8iAZ9Hc1mZK5QoB9MJH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEZonk%2Fbtr45i3eUVH%2Fky8iAZ9Hc1mZK5QoB9MJH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;202&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Reference&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://pypi.org/project/python-redmine/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pypi.org/project/python-redmine/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681567558481&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;python-redmine&quot; data-og-description=&quot;Library for communicating with a Redmine project management application&quot; data-og-host=&quot;pypi.org&quot; data-og-source-url=&quot;https://pypi.org/project/python-redmine/&quot; data-og-url=&quot;https://pypi.org/project/python-redmine/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2tHLm/hyShLiEYjE/KSF3lK9w6a1SOPpKxbW7Gk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot;&gt;&lt;a href=&quot;https://pypi.org/project/python-redmine/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pypi.org/project/python-redmine/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2tHLm/hyShLiEYjE/KSF3lK9w6a1SOPpKxbW7Gk/img.jpg?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;python-redmine&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Library for communicating with a Redmine project management application&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pypi.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://python-redmine.com/index.html&quot;&gt;https://python-redmine.com/index.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681567608330&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Python-Redmine &amp;mdash; Python-Redmine  documentation&quot; data-og-description=&quot;Python-Redmine Python-Redmine is a library for communicating with a Redmine project management application. Redmine exposes some data via REST API for which Python-Redmine provides a simple but powerful Pythonic API inspired by a well-known Django ORM: &amp;gt;&amp;gt;&amp;gt;&quot; data-og-host=&quot;python-redmine.com&quot; data-og-source-url=&quot;https://python-redmine.com/index.html&quot; data-og-url=&quot;https://python-redmine.com/index.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://python-redmine.com/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://python-redmine.com/index.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Python-Redmine &amp;mdash; Python-Redmine documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python-Redmine Python-Redmine is a library for communicating with a Redmine project management application. Redmine exposes some data via REST API for which Python-Redmine provides a simple but powerful Pythonic API inspired by a well-known Django ORM: &amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;python-redmine.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Programming</category>
      <category>PYTHON</category>
      <category>Redmine</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/514</guid>
      <comments>https://pydole.tistory.com/entry/Python-Remine-API-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0#entry514comment</comments>
      <pubDate>Tue, 21 Mar 2023 14:49:52 +0900</pubDate>
    </item>
    <item>
      <title>[ AWS ] Python boto3를 이용하여 S3 object 스토리지 클래스 변경</title>
      <link>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-S3-object-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B3%80%EA%B2%BD</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Python boto3를 이용하여 특정 object의 클래스를 변경해 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679362750231&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# STANDARD &amp;rarr;  STANDARD_IA 클래스 변경

import boto3

s3 = boto3.client('s3')

bucket_name=' '
object_key = ' '

res = s3.copy_object(
    CopySource=f&quot;{bucket_name}/{object_key}&quot;,
    Bucket=bucket_name,
    Key=object_key,
    StorageClass='STANDARD_IA')
    
print(res)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;아래와 같이 스토리지 클래스가 변경되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/48bD4/btr45jmHBbW/2koEGgOV3i1s3dNs7xMrH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/48bD4/btr45jmHBbW/2koEGgOV3i1s3dNs7xMrH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/48bD4/btr45jmHBbW/2koEGgOV3i1s3dNs7xMrH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F48bD4%2Fbtr45jmHBbW%2F2koEGgOV3i1s3dNs7xMrH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1273&quot; height=&quot;219&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS Infra</category>
      <category>boto3</category>
      <category>S3</category>
      <category>변경</category>
      <category>클래스</category>
      <author>Pydole</author>
      <guid isPermaLink="true">https://pydole.tistory.com/513</guid>
      <comments>https://pydole.tistory.com/entry/AWS-Python-boto3%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-S3-object-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B3%80%EA%B2%BD#entry513comment</comments>
      <pubDate>Tue, 21 Mar 2023 10:41:06 +0900</pubDate>
    </item>
  </channel>
</rss>