Glob Pattern을 완벽하게 정리해보자.

RookieAND·2023년 2월 19일
0

Solve My Question

목록 보기
17/27
post-thumbnail

📖 Introduction

도대체 이 괴상망측한 기호들과 애스터리스크는 뭘 의미하는 걸까?

Glob Pattern, 처음엔 익숙치 않았지만 이번 기회에 확실히 정리해보려고 한다~

✒️ Glob Pattern

✏️ Glob Pattern 이란?

  • 여러 와일드카드 문자를 사용하여 다수의 파일 집합을 지정하는 방식
  • 리눅스 뿐만 아니라 Python, Javascript, Go, Ruby 등의 언어에 쓰인다.
// tsconfig.json의 include option.
{
   // ["**/*.ts?(x)] 로도 수정이 가능하다!
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
}

✏️ 왜 이렇게 많이 쓰이는가?

  • 사실, 비슷한 기능을 하는 정규식 (RegExp) 이 더 정교하게 작동할 수도 있다.
  • 하지만 그보다 더 심플한 glob 패턴이 특정 파일을 찾는 경우 에는 좋게 쓰인다.

✒️ Wild Card

✏️ * 기호

  1. 사용법
  • * 기호는 길이와 상관 없이 어떤 문자열과도 부합하게 한다. 공백 또한 포함된다.
  • 단 디렉토리 구분자로 사용되는 \ 혹은 / 기호와는 부합하지 않는다.
  1. 사용 예시
  • *.tsx 는 이름과 상관없이 현재 디렉토리 내의 tsx 파일들을 찾아낸다.
  • test/abc.*test 폴더 내에서 이름이 abc 인 파일을 모두 찾아낸다.

✏️ ** 기호

  1. 사용법
  • ** 기호는 0개 이상의 하위 디렉토리와 매칭이 되게끔 한다.
  • 현재 디렉토리 뿐만 아니라 하위 디렉토리에 있는 파일들도 재귀적으로 탐색 가능하다.
  1. 사용 예시
  • **/*.tsx 는 현재 디렉토리를 기준으로 하위에 속한 모든 tsx 파일을 찾아낸다.
  • **/abc.* 는 현재 디렉토리를 기준으로 하위에 속한 모든 abc 이름의 파일을 찾아낸다.

✏️ ? 기호

  1. 사용법
  • ? 기호는 문자와 상관없이 정확히 한 글자 만 매칭되도록 한다.
  • 하지만 연달아서 사용이 가능하기 때문에 특정 패턴을 조합하기가 용이하다.
  1. 사용 예시
  • a?b?.tsx 는 현재 디렉토리를 기준으로 acbc.tsx, axbx.tsx 등과 같은 파일을 찾아낸다.
  • 하지만 1번째와 3번째에 각각 a, b 가 들어가지 않은 이름의 파일은 찾을 수 없다. (abcd.tsx 등..)

✒️ Bracket

✏️ {} 괄호

  1. 사용법
  • {} 괄호는 두 개 이상의 패턴들을 하나로 통합시켜 매칭시키는 기능을 한다.
  • 쉼표를 기준으로 패턴을 구분지으며, 괄호 내의 패턴 중 하나만 부합해도 통과시킨다.
  1. 사용 예시
  • ts 혹은 tsx 파일만 찾고 싶다면 *.{ts, tsx} 로 작성하여 매칭시킬 수 있다.
  • htm 혹은 html 파일만 찾고 싶다면 *.{htm, html} 로 작성하여 찾을 수 있다.

✏️ [] 괄호

  1. 사용법
  • 문자의 범위를 기준으로 파일을 매칭시키고 싶을 때 [] 기호를 사용할 수 있다.
  • - 기호를 두 문자 사이에 넣으면 두 문자 사이에 있는 모든 문자가 매칭도니다.
  • ! 기호를 괄호 앞에 붙이면 괄호 내의 문자 목록을 매칭에서 제외시켜준다.
  • 개인적으로는 정규식과 문법이 가장 일치하는 패턴이라고 생각한다.
  1. 사용 예시
  • js 혹은 ts 파일을 선택하고 싶은 경우 *.[jt]s 로 작성하여 매칭이 가능하다.
  • 소문자로 된 이름만 채택하고픈 경우 [a-z].* 로 작성하여 검색을 진행하면 된다.

✏️ () 괄호

  1. 사용법
  • ?, * 뒤에 () 괄호를 사용하면 와일드카드 매칭 시 선택지를 제한해줄 수 있다.

  • 단, 빈 문자열 과도 기본적으로 매칭이 되기 때문에 유의하여 사용해야 한다.

  • *.ts?(x) 패턴은 ts 혹은 tsx 확장자 파일과 매칭이 된다.

  • *.(ts|tsx) 패턴은 .tsts, .tstsx, .tsxtsx 등 두 패턴을 혼합한 문자열과도 매칭이 가능하다.

📖 References

profile
항상 왜 이걸 써야하는지가 궁금한 사람

2개의 댓글

comment-user-thumbnail
2024년 5월 10일

#import glob
#from osgeo import ogr
#path = r"D:\test\test_data**.shp"

#filenames=[]
#for filename in glob.glob(path): #glob.glob(path, recursive=True)

filenames.append(filename)

#sejong = QgsVectorLayer(filenames[0], '세종시', 'ogr')
#mart = QgsVectorLayer(filenames[1], '편의점', 'ogr')
#school = QgsVectorLayer(filenames[2], '초등학교', 'ogr')

path = r"D:\test\test_data"
sejong = QgsVectorLayer(path + '\sejong','sejong','ogr')
mart = QgsVectorLayer(path + '\XsDB_CVS_100M_TM','mart','ogr')
school = QgsVectorLayer(path + '\XsDB_PRIMARY_POI_TM','school','ogr')

sejong = processing.run("native:reprojectlayer",{'INPUT':sejong, 'OPERATION': '', 'OUTPUT': 'memory:', 'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:5181')})['OUTPUT']
mart = processing.run("native:reprojectlayer",{'INPUT' : mart, 'OPERATION': '', 'OUTPUT': 'memory:', 'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:5181')})['OUTPUT']
school = processing.run("native:reprojectlayer",{'INPUT':school, 'OPERATION': '', 'OUTPUT': 'memory:', 'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:5181')})['OUTPUT']

#QgsProject.instance().addMapLayer(sejong)
#QgsProject.instance().addMapLayer(mart)
#QgsProject.instance().addMapLayer(school)

school = processing.run("native:clip",{'INPUT':school, 'OUTPUT': 'memory:', 'OVERLAY': sejong})['OUTPUT']
#QgsProject.instance().addMapLayer(school)

buffer_distance= QInputDialog.getInt(None,'버퍼','버퍼사이즈')[0]
school = processing.run("native:buffer",{'INPUT':school, 'OUTPUT': 'memory:','DISSOLVE': False, 'DISTANCE': buffer_distance, 'END_CAP_STYLE': 0,'JOIN_STYLE': 0, 'MITER_LIMIT': 2,'SEGMENTS': 5})['OUTPUT']

school = processing.run("native:countpointsinpolygon",{'POINTS':mart,'POLYGONS':school ,'CLASSFIELD': '', 'FIELD': 'NUMPOINTS', 'OUTPUT': 'memory:', 'WEIGHT': ''})['OUTPUT']
QgsProject.instance().addMapLayer(school)

grid_size= QInputDialog.getInt(None,'그리드','그리드사이즈')[0]
sejong_grid = processing.run("native:creategrid",{'CRS': 'ProjectCrs', 'EXTENT': sejong , 'HOVERLAY': 0, 'HSPACING': grid_size, 'OUTPUT': 'memory:', 'TYPE': 4, 'VOVERLAY': 0, 'VSPACING': grid_size })['OUTPUT']

#sejong_clip = processing.run("native:clip",{'INPUT':sejong_grid, 'OUTPUT': 'memory:', 'OVERLAY': sejong})['OUTPUT']
sejong_clip = processing.run("native:extractbylocation",{'INPUT' : sejong_grid, 'INTERSECT' : sejong, 'OUTPUT' : 'memory:', 'PREDICATE' : [0] })['OUTPUT']

sejong_res = processing.run("native:countpointsinpolygon",{'POINTS':mart,'POLYGONS':sejong_clip ,'CLASSFIELD': '', 'FIELD': 'NUMPOINTS', 'OUTPUT': 'memory :', 'WEIGHT': ''})['OUTPUT']
QgsProject.instance().addMapLayer(sejong_res)
#QgsProject.instance().addMapLayer(mart)

답글 달기
comment-user-thumbnail
2024년 5월 10일

path = r"D:\pyqgis\ab.gpkg"

iface.addRasterLayer(path)
iface.addVectorLayer(path ,'', 'ogr')

다른방법

/#from osgeo import ogr
path = r"D:\pyqgis\ab.gpkg"

iface.addRasterLayer(path)

conn = ogr.Open(path)

for i in conn:

iface.addVectorLayer(path + "|layername=" + i.GetName(), i.GetName(), 'ogr')

####################shp파일,gpkg

file_path =r'D:\pyqgis\ex02\buffer.shp'
vlayer = QgsVectorLayer(file_path, "", "ogr")
QgsProject.instance().addMapLayer(vlayer)

import os
base_path = os.path.join("D:","pyqgis","natural_earth_vector.gpkg")
gpkg_countries_layer = base_path + "|layername=ne_10m_admin_0_antarctic_claim_limit_lines"
vlayer = QgsVectorLayer(gpkg_countries_layer, "Countries layer", "ogr")
QgsProject.instance().addMapLayer(vlayer)
##gpkg에서 벡터, 래스터
import os
path = os.path.join("D:\","pyqgis","ab.gpkg")
a = path + "|layername=a01"
b = path + "|layername=a02"
c = "GPKG:"+path+":b01"
school = QgsVectorLayer(a, "sc", "ogr")
market = QgsVectorLayer(b, "sc2", "ogr")
aa = QgsRasterLayer(c, "sc3", "gdal")
QgsProject.instance().addMapLayer(school)
QgsProject.instance().addMapLayer(market)
QgsProject.instance().addMapLayer(aa)
########CSV

uri = "file:///D:/pyqgis/123.csv?delimiter={}&xField={}&yField={}".format(",", "x", "y")
vlayer = QgsVectorLayer(uri, "a", "delimitedtext")
QgsProject.instance().addMapLayer(vlayer)

답글 달기