728x90

1. 현재 Linux 버전 확인

 

2. python download

 

wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz

 

2-1 패키지 설치

sudo apt install libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev libtk8.6 libgdm-dev libdb4o-cil-dev libpcap-dev

 

3. 압축 풀기

tar -xvf Python-3.10.13.tgz

 

4. 이동

cd Python-3.10.13/

 

5. Configure

./configure

 

5-1 . Error : configure: error: no acceptable C compiler found in $PATH

 sudo apt-get install gcc

 

gcc 설치 후 다시 ./configure

 

6. Make

sudo make install

 

6-1 Command 'make' not found, but can be installed with:

sudo apt install make

그리고 다시 sudo make install

 

6-2 Command  returned non-zero exit status 1.

sudo apt-get install virtualenv

그리고 다시 sudo make install

 

6-3 ModuleNotFoundError: No module named 'zlib'

sudo apt-get install zlib1g zlib1g-devel

그리고 다시 sudo make install

 

7. Symbolic link 만들기

 

sudo ln -s /usr/local/bin/python3.10 python
sudo ln -s /usr/local/bin/pip3.10 pip
728x90

'Programming > Python' 카테고리의 다른 글

[Python] Tensoflow F1 score metrics  (0) 2022.09.22
[python]무작위 페이크 이름 생성기  (0) 2022.05.13
[#1] 파이썬에 대하여 개인적인 생각  (0) 2021.12.24
[#0] 파이썬  (0) 2021.12.06
728x90

Java를 사용하기 위해서 JDK 를 설치해야 하는데 오라클에서 매번 다운받아서 설치하기가 너무 귀찮아서 openJdk를 언제부턴가 계속 쓰고 있다.

openJDK 는 jdk.java.net 에서 다운로드 받을 수 있습니다.

Ready fo use 를 보면 JDK19를 다운로드 받을수있네요.

그런데 제가 사용하고 싶은 JDK는 17버전입니다.

Archive 로 이동 해줍니다. https://jdk.java.net/archive/

사용하는 운영 체제에 맞게 다운로드 받아 줍니다. 저는 윈도우 환경이므로 Windows 64-bit를 다운받아줬습니다.

압축을 풀어서 Program File안에 Java 폴더로 옮겨줬습니다.

이전에 설치한 버전도 있습니다. 2개나....

이제환경변수를 등록해 줍니다.

 

JAVA_HOME 으로 변수를 등록해 주고

Path 에 추가 해 줬습니다.

cmd 에서 java version을 확인 해봅니다.

 

 

 

JDK 17을 사용하게 된 이유는 spring boot 3.0버전 대를 사용하려면 JDK17이 최소 필요사항입니다.

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes

728x90
728x90
class F1Score(tf.keras.metrics.Metric):
    def __init__(self, name='F1Score', **kwargs):
        super(F1Score, self).__init__(name=name, **kwargs)
        self.f1score = self.add_weight(name='F1Score', initializer='zeros')
        self.count = self.add_weight(name='F1ScoreCount', initializer='zeros')

    def update_state(self, y_true, y_pred, sample_weight=None):
        y_true = tf.cast(y_true, tf.bool)
        y_pred = tf.cast(y_pred, tf.bool)

        true_positives = tf.logical_and(tf.equal(y_true, True), tf.equal(y_pred, True))
        true_positives = tf.cast(true_positives, self.dtype)
        count_true_positives = tf.reduce_sum(true_positives)

        possible_positives = tf.cast(y_true, self.dtype)
        count_possible_positives = tf.reduce_sum(possible_positives)

        predicted_positives = tf.cast(y_pred, self.dtype)
        count_predicted_positives = tf.reduce_sum(predicted_positives)

        precision = count_true_positives / (count_predicted_positives + K.epsilon())
        recall = count_true_positives / (count_possible_positives + K.epsilon())
        f1_cal = 2*(precision*recall)/(precision + recall + K.epsilon())

        self.count.assign_add(1)
        a = 1.0 / self.count
        b = 1.0 - a
        self.f1score.assign(a*f1_cal+b*self.f1score)

    def result(self):
        return self.f1score
728x90

'Programming > Python' 카테고리의 다른 글

[Python] Ubuntu 20.04에 python 3.10 설치  (0) 2024.03.11
[python]무작위 페이크 이름 생성기  (0) 2022.05.13
[#1] 파이썬에 대하여 개인적인 생각  (0) 2021.12.24
[#0] 파이썬  (0) 2021.12.06
728x90

개요


  • 개발할때 필요한 이름이 들어간 데이터를 빈번히 수동으로 입력하는 불편함을 해소 하기위한 방법을 고민하던중 첫번째로 이름을 무작위로 생성하는 시뮬레이터를 만들어보기로 했다.
  • 전자가족관계등록시스템에서 제공하는 통계데이터를 활용하였다.
  • 이름의 경우 서울특별시를 기준으로 2008년,2012년,2022년 , 3년도의 데이터를 다운로드받아 사용하였다.
    • 상위 출생신고 이름 현황 링크
    • 가족관계등록부상 성씨 현황 링크

github 링크

1. 개발환경 세팅


  • OS : window 64bit
  • python 3.10.x
  • Editor : vscode + python extention
  • python-packages : pandas

1. 디렉토리 만들기

먼저 디렉토리 및 파일들을 만들어 주겠습니다.

simulator 라는 최상위 디렉토리를 만들어 주고 data가 있는 upload 디렉토리안에 xlsx,json 디렉토리를 차례대로 만들어 줍니다.

 

디렉토리를 만드는 것은 여러가지 방법이 있지만, cmd에 명령어로 생성 해주고, 해당 디렉토리로 이동합니다.

mkdir simulator; simulator\upload;simulator\upload\xlsx;simulator\upload\json cd .\simulator

2. 파이썬 가상환경

이동한 디렉토리에서 파이썬 가상환경을 만들어 줍니다.

이름은 simulator로 하겠습니다.

python -m venv simulator

 

3.VScode 설정

code ./

vscode를 열어 줍니다.

vscode에 python extention이 설치가 되어있으면, F1 또는 명령 팔레트를 통해 python select 검색후 디버깅시 사용할 python을 선택해 줍니다.

 

 

 

4. 파일 이동

  • 전자가족관계등록시스템에서 받은 이름 + 성씨 파일을 upload→ xlsx 폴더로 옮겨줍니다.

 

2. 파일 정제


이름 생성기는 성씨 파일에서 가져온 성씨 + 이름 파일에서 가져온 이름을 랜덤하게 조합해 생성합니다.

하지만 현재 다운로드 받은 파일들은 불필요한 데이터가 있기때문에 이러한 데이터들을 제거하고, 3년도로 나뉘어진 파일들을 모두 불러와 성씨 + 이름 데이터가 있는 1개의 json 파일로 만들어 주겠습니다.

 

1. package 설치

 

먼저 터미널을 열어 엑셀 파일을 다루기 위해 pandas 와 xlrd 패키지를 설치해 줍니다.

python -m pip install pandas xlrd

 

2. merge_files 함수 생성

name.py 함수에 merge_files함수를 생성해 주겠습니다.

merge_files 함수는 모든 이름 + 성씨 파일을 불러와 정제후 하나로 합치고, json 파일로 저장하는 기능을 합니다.

 

 

먼저 pandas 를 import 한후 merge_files 함수를 정의합니다.

 

import pandas as pd  def merge_files():     pass

이제 pass 부분에 필요한 코드들을 작성합니다.

 

먼저 pandas의 read_excel 함수를 사용해 모든 파일들을 불러와 변수에 대입합니다.

 

import pandas as pd  def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls')     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls')     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls')     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls')

이쯤 각각의 변수를 출력해 보면서 디버깅을 해보겠습니다.

하기전에 다음의 코드를 추가해 줍니다.

import pandas as pd  def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls')     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls')     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls')     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls')     print(family_names)     print(name_2022)     print(name_2012)     print(name_2008)  if __name__=="__main__":     merge_files()

F5를 눌러 실행시켜줍니다.

각각 의 파일들의 헤더가 1 행씩 밀려서 나오기 때문에 read_excel 함수에 header 매개변수를 1 로 넣어 줍니다.

import pandas as pd  def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)     print(family_names)     print(name_2022)     print(name_2012)     print(name_2008)  if __name__=="__main__":     merge_files()

 

각각의 데이터를 살펴 보면

성씨의 경우

성씨라는 컬럼의 데이터가 필요하고 여기에 입력 된 데이터를 번호. 성씨로 되어있습니다.

이 번호를 지원주는 코드를 추가하면 됩니다. 그리고 성별이 남녀로 2개씩 중복되기때문에 unique함수를 써주면 좋을것 같습니다.

이름의 경우

이름 컬럼의 데이터만 가져오면 될것같습니다. 그리고 3개를 1개로 합쳐 주면 됩니다.

이제 위에서 생각해본 대로 해당 코드를 이어서 작성해 줍니다.

 

import pandas as pd  def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist()     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1]     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1]     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1]     names = pd.concat([name_2022,name_2012,name_2008]).tolist()     print(family_names)     print(names) if __name__=="__main__":     merge_files()

출력된 결과를 보면 기타 라는 데이터가 들어가 있고, 중복된것도 있는거 같습니다. 이를 처리해 주는 코드를 작성해 주고, 각각의 리스트들을 key에 담아 딕셔너리로 만들어 json파일로 저장하는 과정을 코드로 작성합니다.

 

먼저 filter 함수로 기타를 삭제하고, set으로 names의 중복을 제거후 다시 list함수로 리스트로 만들어 줍니다.

import pandas as pd  def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist()     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1]     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1]     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1]     names = pd.concat([name_2022,name_2012,name_2008]).tolist()     names.remove('기타')     names = list(set(names))     print(family_names)     print(names) if __name__=="__main__":     merge_files()

 

 

이제 json 모듈을 import 한 후 각각의 리스트를 담은 딕셔너리를 만들어 json으로 저장합니다.

json은 upload → json 에 names.json이라는 파일로 저장하겠습니다.

 

import pandas as pd import json def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist()     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1]     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1]     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1]     names = pd.concat([name_2022,name_2012,name_2008]).tolist()     names.remove('기타')     names = list(set(names))     names_dic = {'f':family_names,'n':names}     with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f:         json.dump(names_dic,f)     print(family_names)     print(names) if __name__=="__main__":     merge_files()

file이 생성 잘 생성되었습니다.

 

이제 이 파일을 불러와 데이터가 정상적으로 들어가있는지 확인해 봅니다.

import pandas as pd import json def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist()     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1]     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1]     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1]     names = pd.concat([name_2022,name_2012,name_2008]).tolist()     names.remove('기타')     names = list(set(names))     names_dic = {'f':family_names,'n':names}     with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f:         json.dump(names_dic,f)     print(family_names)     print(names) if __name__=="__main__":     merge_files()     with open('.\\upload\\json\\names.json','r',encoding='utf-8') as f:         names_dic = json.load(f)         print(names_dic)

정상적으로 잘 들어있네요.!

 

 

3.class Name


파일을 정제해 하나의 json 파일로 만들었습니다. 이제 이 파일에 들어있는 데이터를 통해 이름을 생성하는 기능들을 담고 있는 class를 만들어 주겠습니다.

 

merge_files 함수 밑으로 class Name을 선언합니다.

print 와 if __name__... 밑으로 작성된 코드들은 삭제 처리 해주겠습니다.

그리고 if __name__..밑으로는 Name 클래스를 불러와 줍니다.

import pandas as pd import json def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist()     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1]     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1]     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1]     names = pd.concat([name_2022,name_2012,name_2008]).tolist()     names.remove('기타')     names = list(set(names))     names_dic = {'f':family_names,'n':names}     with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f:         json.dump(names_dic,f)   class Name:     pass if __name__=="__main__":     n = Name()

 

1. 생성자

class Name 에 필요한 생성자를 만들어 봅니다.

class Name:     def __init__(self):         pass

필요한 것은 위에서 만든 json 파일안의 데이터가 들어와있어야 합니다.

이 json파일을 불러오는 기능을 하는 read_json() 함수를 만들어 주고, self.names_dic 변수에 이 함수의 반환값을 넣어 주겠습니다.

class Name:               def __init__(self):         self.names_dic = self.read_json()              def read_json(self):         with open('.\\upload\\json\\names.json') as f:             data = json.load(f)         return data

이때 파일 경로는 상대적 경로로 지정해 주었습니다.

os 모듈을 사용해 실행되는 파일의 절대 경로와 합쳐 주겠습니다.

상단에 os 모듈을 import 시켜 줍니다.

print(n.names_dic)으로 데이터가 잘 있는지 확인해 줍니다.

import pandas as pd import json import os   def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist()     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1]     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1]     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1]     names = pd.concat([name_2022,name_2012,name_2008]).tolist()     names.remove('기타')     names = list(set(names))     names_dic = {'f':family_names,'n':names}     with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f:         json.dump(names_dic,f)   class Name:               def __init__(self):         self.names_dic = self.read_json()              def read_json(self):         file_ = os.path.abspath(os.path.dirname(__file__))         filepath = os.path.join(file_,'upload','json','names.json')         with open(filepath,'r',encoding='utf-8') as f:             data = json.load(f)         return data           if __name__=="__main__":     n = Name()         print(n.names_dic)

잘 나오네요.

이제 이중에 키 f의 값들은 self.f에 n 값들은 self.n에 대입해 줍니다.

 

2. 이름 1개 무작위 생성

이름 1개를 무작위로 생성하는 기능을 하는 함수 generate() 를 만들어 줍니다.

random 모듈의 randint 함수를 활용해 무작위로 나온 정수로 self.f 와 self.n 의 값을 무작위로 가져와 합쳐줍니다. 각각의 randint 의 마지막값으로는 self.f 와 self.n의 길이에서 -1을 해준값을 넣어 줍니다.

코드작성후 5번 정도 실행해 출력값을 확인해 보겠습니다.

print(n.generate()) print(n.generate()) print(n.generate()) print(n.generate())

class Name:               def __init__(self):         self.names_dic = self.read_json()         self.f = self.names_dic['f']         self.n = self.names_dic['n']      def read_json(self):         file_ = os.path.abspath(os.path.dirname(__file__))         filepath = os.path.join(file_,'upload','json','names.json')         with open(filepath,'r',encoding='utf-8') as f:             data = json.load(f)         return data          def generate(self):         fr = random.randint(0,len(self.f))         fn = random.randint(0,len(self.n))         fr = self.f[fr]         fn = self.n[fn]         result = fr + fn         return result      if __name__=="__main__":     n = Name()     		print(n.generate())     print(n.generate())     print(n.generate())     print(n.generate()) 		print(n.generate())

 

 

5개 모두 잘 나오네요!

 

4. Generate 많이 많이


이름을 여러개 만들기 위해서 generate 함수를 여러번 돌려야 합니다.

차라리 generate 함수에서 num 매개변수를 받아 for문을 돌려서 list형태로 반화하도록 수정합니다.

기본값을 1로 하여 generate함수에 매개변수를 입력하지 않을경우에는 1개의 이름이 들어있는 리스트를 반환하도록 합니다.

기존에 만들었던 generate 함수 앞에 언더스코어 2개를 붙여 맹글링 처리를 하고, 새로운 generate함수를 선언하여 리스트 컴프리핸션으로 __generate 함수를 불러오는 방식으로 코드를 작성했습니다.

 

작성한 코드를 테스트 하기위해 매개변수를 다 다르게 넣어 출력값을 확인해 봅니다.

class Name:               def __init__(self):         self.names_dic = self.read_json()         self.f = self.names_dic['f']         self.n = self.names_dic['n']      def read_json(self):         file_ = os.path.abspath(os.path.dirname(__file__))         filepath = os.path.join(file_,'upload','json','names.json')         with open(filepath,'r',encoding='utf-8') as f:             data = json.load(f)         return data          def __generate(self):         fr = random.randint(0,len(self.f)-1)         fn = random.randint(0,len(self.n)-1)         fr = self.f[fr]         fn = self.n[fn]         result = fr + fn         return result          def generate(self,num=1):         return [self.__generate() for _ in range(num)]      if __name__=="__main__":     n = Name()       n_default =  n.generate()     print('기본',len(n_default))     for i in [10,100,500,900]:         n_g = n.generate(i)         print(f'이름 {i}개 생성',len(n_g))

 

 

잘 생성 되었네요!!

 

5. 좀 더 괜찮게? 수정을 해보자


num에 넣어준 개수 만큼 이름이 생성되지만, 중복을 제거하면, 입력된 num 보다 더 적은 수만큰 생성됩니다.

중복을 허용하지 않으면서 원하는 개수만큼 만들어 주고 싶네요.

그런데 조합의 수를 고려하면 현재 데이터로는 일정 개수 이상으로는 만들수가 없습니다.

현재 데이터에 포함된 성씨는 20개 , 이름은 40개 입니다.

조합의 수를 생각해 보면 800개 입니다.

최대 조합의 수를 늘리기 위해 self.n에 있는 이름에 쓰이는 한글을 1글자씩 중복되지 않는 한글 리스트로 만들어 주고, 이름의 첫번째에 쓰인 것은 2번째는 쓰이지 않도록 하는 과정을 거쳐 최대 조합의 수를 늘려 보도록 하겠습니다.

 

1. 데이터 수정

먼저 self.n에 있는 데이터를 중복되지 않는 한글 1자를 요소로 가지는 리스트로 변환하여 줍니다.

names_to_char라는 함수를 만들어 사용해 보겠습니다.

그리고 self.c에 이 데이터를 담아 출력해 봅니다.

class Name:               def __init__(self):         self.names_dic = self.read_json()         self.f = self.names_dic['f']         self.n = self.names_dic['n']         self.c = self.__names_to_char(self.n)      def read_json(self):         file_ = os.path.abspath(os.path.dirname(__file__))         filepath = os.path.join(file_,'upload','json','names.json')         with open(filepath,'r',encoding='utf-8') as f:             data = json.load(f)         return data          def __generate(self):         fr = random.randint(0,len(self.f)-1)         fn = random.randint(0,len(self.n)-1)         fr = self.f[fr]         fn = self.n[fn]         result = fr + fn         return result          def __names_to_char(self,name=[]):         result = []         for s in name:             result += list(s)         result = list(set(result))         return result                   def generate(self,num=1):         return [self.__generate() for _ in range(num)]      if __name__=="__main__":     n = Name()       print(n.c)     print(len(n.c))

 

 

 

총 29개의 한글이 생겼습니다. 이제 이 self.c를 이용하면 20 * 29 * 28 = 16240 개의 이름 조합을 생각해 볼수 있습니다.

이 최대 조합의 수를 self.max_num 에 담아 주고,

__generate 함수와 generate 함수를 수정해 줍니다.

class Name:               def __init__(self):         self.names_dic = self.read_json()         self.f = self.names_dic['f']         self.n = self.names_dic['n']         self.c = self.__names_to_char(self.n)         self.max_num = 16240       def read_json(self):         file_ = os.path.abspath(os.path.dirname(__file__))         filepath = os.path.join(file_,'upload','json','names.json')         with open(filepath,'r',encoding='utf-8') as f:             data = json.load(f)         return data          def __generate(self):         result = ''         i = random.randint(0,len(self.f)-1)         result += self.f[i]         ic = random.randint(0,len(self.c)-1)         s = self.c[ic]         result += self.c[ic]         self.c.remove(s)         i = random.randint(0,len(self.c)-1)         result += self.c[i]         self.c.insert(ic,s)         return result                    def __names_to_char(self,name=[]):         result = []         for s in name:             result += list(s)         result = list(set(result))         return result                   def generate(self,num=1):         i = 1         result = {}         while i<=num:             print(f'{i}\r',end='')             k = self.__generate()             try:                 g = result[k]                 if self.max_num+1 ==i:                     break             except:                 result[k] = 0                 i+=1         result = list(result.keys())         return result        if __name__=="__main__":     n = Name()       n_default = n.generate()     n_500 = n.generate(500)     n_16241 = n.generate(16241)      print(n_default,len(n_default))     print(len(n_500))     print(len(n_16241))

 

 

6. txt 파일로 저장!


생성된 이름들을 txt 파일로 저장하는 함수를 만들어 줍니다.

함수명을 save로 하고, 파라미터로는 저장할 데이터 리스트와 저장되는 경로를 받아옵니다.

class Name:               def __init__(self):         self.names_dic = self.read_json()         self.f = self.names_dic['f']         self.n = self.names_dic['n']         self.c = self.__names_to_char(self.n)         self.max_num = 16240       def read_json(self):         file_ = os.path.abspath(os.path.dirname(__file__))         filepath = os.path.join(file_,'upload','json','names.json')         with open(filepath,'r',encoding='utf-8') as f:             data = json.load(f)         return data          def __generate(self):         result = ''         i = random.randint(0,len(self.f)-1)         result += self.f[i]         ic = random.randint(0,len(self.c)-1)         s = self.c[ic]         result += self.c[ic]         self.c.remove(s)         i = random.randint(0,len(self.c)-1)         result += self.c[i]         self.c.insert(ic,s)         return result                    def __names_to_char(self,name=[]):         result = []         for s in name:             result += list(s)         result = list(set(result))         return result                   def generate(self,num=1):         i = 1         result = {}         while i<=num:             print(f'{i}\r',end='')             k = self.__generate()             try:                 g = result[k]                 if self.max_num+1 ==i:                     break             except:                 result[k] = 0                 i+=1         result = list(result.keys())         return result      def save(self,data=[],filepath='./names.txt'):         with open(filepath,'w',encoding='utf-8') as f:             f.write('\n'.join(data))      if __name__=="__main__":     n = Name()       n_500 = n.generate(500)     n.save(n_500,'.\\names.txt')

 

 

7. 파이썬 실행을 위한 argument 받아 오기


이제 파이썬으로 해당 파일을 실행할때 필요한 인자를 받아 오기 위해 argparse 모듈을 사용해 추가적인 코드를 작성해 줍니다.

실행 하면서 완료되는 출력문들도 넣어 줍니다

전체코드 입니다.

# 전체 코드 import pandas as pd import json import os import random import argparse  def merge_files():     family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist()     name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1]     name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1]     name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1]     names = pd.concat([name_2022,name_2012,name_2008]).tolist()     names.remove('기타')     names = list(set(names))     names_dic = {'f':family_names,'n':names}     with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f:         json.dump(names_dic,f)   class Name:               def __init__(self):         self.names_dic = self.read_json()         self.f = self.names_dic['f']         self.n = self.names_dic['n']         self.c = self.__names_to_char(self.n)         self.max_num = 16240       def read_json(self):         file_ = os.path.abspath(os.path.dirname(__file__))         filepath = os.path.join(file_,'upload','json','names.json')         with open(filepath,'r',encoding='utf-8') as f:             data = json.load(f)         return data          def __generate(self):         result = ''         i = random.randint(0,len(self.f)-1)         result += self.f[i]         ic = random.randint(0,len(self.c)-1)         s = self.c[ic]         result += self.c[ic]         self.c.remove(s)         i = random.randint(0,len(self.c)-1)         result += self.c[i]         self.c.insert(ic,s)         return result                    def __names_to_char(self,name=[]):         result = []         for s in name:             result += list(s)         result = list(set(result))         return result                   def generate(self,num=1):         print('이름을 생성합니다.')         i = 1         result = {}         while i<=num:             print(f'{i}\r',end='')             k = self.__generate()             try:                 g = result[k]                 if self.max_num+1 ==i:                     break             except:                 result[k] = 0                 i+=1         result = list(result.keys())         print('이름 생성 완료')         return result      def save(self,data=[],filepath='./names.txt'):         with open(filepath,'w',encoding='utf-8') as f:             f.write('\n'.join(data))         print(f'{filepath} 저장 완료')           if __name__=="__main__":     n = Name()       parser = argparse.ArgumentParser()     parser.add_argument('--num',default=1,help="생성하는 이름의 개수 지정")     parser.add_argument('--filepath',default='.\\names.txt',help="저장 경로(default=현재 경로 names.txt )")      args =parser.parse_args()     num = int(args.num)     filepath =args.filepath     data= n.generate(num)     n.save(data,filepath) 

 

파일을 저장하고 터미널에 아래와 같은 명령어를 입력해 테스트 해봅니다.

 

python name.py --num 30 --filepath .\\names_text.txt

 

 

아주 잘 되는 군요 ㅎㅎ

 

회고


이름 생성기를 만들면서 다른 정보를 포함한 개인정보 생성 모듈을 만들면 좋겠다는 생각이 들었스니다.

 

이름 생성을 위해 한글을 좀더 추가 해 준다면, 더 많은 조합을 생성해 볼수 있지 않을까 합니다.

다음은 다른걸 만들어 봐야겠습니다.

 

 

728x90

'Programming > Python' 카테고리의 다른 글

[Python] Ubuntu 20.04에 python 3.10 설치  (0) 2024.03.11
[Python] Tensoflow F1 score metrics  (0) 2022.09.22
[#1] 파이썬에 대하여 개인적인 생각  (0) 2021.12.24
[#0] 파이썬  (0) 2021.12.06
728x90

세상에는 정말 많은 언어 들이 있습니다.

C / C++ ,JAVA, Python,Ruby, Go,Rust 등등등

GitHub의 Pull Request(2021.3 분기 ) 언어 랭킹 순위를 보면 Javascript 다음으로 Python 이 2위에 랭크되어있습니다.

그만큼 많이 쓰이고 있다는 것이겠죠?

 

언어의 선택은 언제나 고민이 되는 부분입니다.

감사하게도, 저는 처음 배운 언어로 업무를 대부분 하고 있습니다.

하지만, 다른 언어들 또한 사용하기때문에 1가지 프로그래밍 언어만 사용한다고 볼 수는 없겠네요.

그럼 왜 이렇게 Python 이라는 언어는 인기가 많은 것일까요?

여러 이유들이 있겠지만, 제 개인적인 생각은 프로그래밍 언어 중에서는 배우기에 가장 쉽다. 인것 같습니다.

또한 많은 라이브러리들이 있다는 점도 꼽을 수 있겠네요.

 

하지만, 파이썬 만으로는 부족함을 느끼기도 합니다.

 

이러한 파이썬에 대해 기본적인 문법부터 차근 차근 되짚어 가면서 개인적인 경험과 생각을 한번 작성해 보도록 할 계획입니다.

728x90

'Programming > Python' 카테고리의 다른 글

[Python] Ubuntu 20.04에 python 3.10 설치  (0) 2024.03.11
[Python] Tensoflow F1 score metrics  (0) 2022.09.22
[python]무작위 페이크 이름 생성기  (0) 2022.05.13
[#0] 파이썬  (0) 2021.12.06
728x90

파이썬 스터디 기록

파이썬으로 할 수 있는 것

Python

제가 주로 사용하는 프로그래밍 언어중 50%는 파이썬입니다.

파이썬은 가장 배우기 쉽고 사용하기 쉬운 언어로 생각되기는 하지만, 사용해 볼수록 많은 생각을 들게 하는 언어이기도 합니다.

기존의 파이썬에 대한 기본적인 방법과 함께 다양한 코드들을 분석해 보면서 

기록하고 스터디 해보기 위한 글들을 작성해 볼 예정입니다.

글을 올리는 시간도 기간도 정확하게 정해지지 않았지만, 되도록 많은 것들을 기록해 볼 까 합니다.

누군가는 읽을지도 모르는 제 블로그에 대해서 좋은 방향으로 나아갈 수 있도록 해보겠습니다.

728x90

+ Recent posts