>  기사  >  백엔드 개발  >  CSV - Python에서 로컬 및 원격 파일 처리

CSV - Python에서 로컬 및 원격 파일 처리

WBOY
WBOY원래의
2024-08-28 18:30:37384검색

CSV - Process Local & Remote Files in Python

안녕 코더 여러분!

이 문서에서는 로컬 및 원격 CSV 파일을 처리하고, 정보를 로드 및 인쇄하고, 나중에 열을 Django 유형에 매핑할 수 있는 오픈 소스 도구를 소개합니다. 일반적으로 데이터 세트가 커지고 사용자 정의 보고서가 Excel에서 지원되지 않거나 데이터 테이블을 통한 전체 데이터 조작이 지원되지 않는 경우 CSV 파일 처리가 필요하며 API가 필요합니다.
현재 기능 목록을 더욱 확장하여 CSV 파일을 데이터베이스 테이블/모델에 매핑하고 대시보드 웹 앱을 완전히 생성할 수 있습니다.

소스 코드: AppSeed 서비스의 CSV 프로세서 부분(오픈 소스)


코드와 사용법을 설명하기 전에 도구 기능을 요약해 보겠습니다.

  • 로컬 및 원격 파일 로드
  • 값 인쇄
  • 감지된 열 유형 인쇄
  • Django 모델에 대한 매핑 유형 인쇄

CSV 파서는 README에 설명된 대로 프로젝트 소스를 복제하고 사용할 수 있게 만든 후 CLI를 통해 실행할 수 있습니다. 설치가 완료되면 다음 한 줄을 사용하여 CVS 프로세서를 호출할 수 있습니다.

$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect.json

이 도구는 다음 작업을 수행합니다.

  • 입력 유효성 검사
  • CSV 파일 찾기(찾을 수 없으면 오류로 종료)
  • 정보를 로드하고 열 유형을 감지합니다.
  • Django 열 유형 감지
  • 처음 10개 행 인쇄

로컬 및 원격 파일에도 동일하게 적용될 수 있습니다. 예를 들어, 다음 한 줄을 실행하여 악명 높은 Titanic.cvs를 분석할 수 있습니다.

$ python manage.py tool_inspect_source -f media/tool_inspect/csv_inspect_distant.json

# Output
> Processing .\media\tool_inspect\csv_inspect_distant.json
    |-- file: https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv
    |-- type: csv


Field        CSV Type    Django Types
-----------  ----------  ------------------------------------------
PassengerId  int64       models.IntegerField(blank=True, null=True)
Survived     int64       models.IntegerField(blank=True, null=True)
Pclass       int64       models.IntegerField(blank=True, null=True)
Name         object      models.TextField(blank=True, null=True)
Sex          object      models.TextField(blank=True, null=True)
Age          float64     models.FloatField(blank=True, null=True)
SibSp        int64       models.IntegerField(blank=True, null=True)
Parch        int64       models.IntegerField(blank=True, null=True)
Ticket       object      models.TextField(blank=True, null=True)
Fare         float64     models.FloatField(blank=True, null=True)
Cabin        object      models.TextField(blank=True, null=True)
Embarked     object      models.TextField(blank=True, null=True)


[1] - PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
[2] - 1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
[3] - 2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
[4] - 3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
[5] - 4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
[6] - 5,0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S
[7] - 6,0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q
[8] - 7,0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S
[9] - 8,0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S
[10] - 9,1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S
... (truncated output)  

도구의 관련 부분은 다음과 같습니다.

정보를 로드하고 소스가 로컬인지 원격인지 사전 확인

    print( '> Processing ' + ARG_JSON )
    print( '    |-- file: ' + JSON_DATA['source'] )
    print( '    |-- type: ' + JSON_DATA['type'  ] )
    print( '\n')

    tmp_file_path = None 

    if 'http' in JSON_DATA['source']:
        url = JSON_DATA['source']
        r = requests.get(url)
        tmp_file = h_random_ascii( 8 ) + '.csv'
        tmp_file_path = os.path.join( DIR_TMP, tmp_file )
        if not file_write(tmp_file_path, r.text ):
            return
        JSON_DATA['source'] = tmp_file_path
    else:    
        if not file_exists( JSON_DATA['source'] ):
            print( ' > Err loading SOURCE: ' + JSON_DATA['source'] )            
            return

    csv_types = parse_csv( JSON_DATA['source'] )

헤더를 분석하고 감지된 유형을 Django 유형에 매핑합니다.

테이블 형식 보기에는 Tabulate 라이브러리가 사용됩니다.

    csv_types = parse_csv( JSON_DATA['source'] )

    #pprint.pp ( csv_types )

    table_headers = ['Field', 'CSV Type', 'Django Types']
    table_rows    = []

    for t in csv_types:
        t_type        = csv_types[t]['type']
        t_type_django = django_fields[ t_type ]
        table_rows.append( [t, t_type, t_type_django] )

    print(tabulate(table_rows, table_headers))

마지막 단계는 CSV 데이터 인쇄입니다.

    csv_data = load_csv_data( JSON_DATA['source'] )

    idx = 0
    for l in csv_data:
        idx += 1
        print( '['+str(idx)+'] - ' + str(l) )  

        # Truncate output ..
        if idx == 10:
            print( ' ... (truncated output) ' ) 
            break 

이 시점에서 코드는 Django의 CSV 정보, 데이터 유형 및 해당 데이터 유형에 대한 액세스를 제공합니다. Flask, Express 또는 NextJS와 같은 프레임워크에 대해 매핑을 쉽게 확장할 수 있습니다.

Django의 유형 매핑은 다음과 같습니다.

# Pandas Type
django_fields = {
    'int'           : 'models.IntegerField(blank=True, null=True)',
    'integer'       : 'models.IntegerField(blank=True, null=True)',
    'string'        : "models.TextField(blank=True, null=True)",
    'string_unique' : "models.TextField(blank=True, null=False, unique=True)",
    'object'        : "models.TextField(blank=True, null=True)",
    'object_unique' : "models.TextField(blank=True, null=False, unique=True)",
    'int64'         : 'models.IntegerField(blank=True, null=True)',
    'float64'       : 'models.FloatField(blank=True, null=True)',
    'bool'          : 'models.BooleanField(null=True)',
}

이 도구는 현재 개발 중이며 다음 단계는 다음과 같습니다.

  • 원격/로컬 데이터베이스(SQLite, MySql, PgSQL), JSON과 같은 더 많은 데이터 소스에 도구를 연결하세요.
  • FastAPI, Flask, Express, NextJS 등 모든 프레임워크에 대한 모델 생성
  • 상위에서 보안 API 생성
  • 스타일 지정을 위해 Tailwind/Bootstrap을 사용하여 서버 측 페이지가 매겨진 DataTable 생성

읽어주셔서 감사합니다!

기여에 관심이 있는 분들은 새로운 AppSeed 플랫폼에 가입하고 Discord에서 커뮤니티와 연결하세요.

  • AppSeed - 개발자를 위한 오픈 소스 플랫폼
  • AppSeed 커뮤니티 - 3,000명 이상의 Discord 회원

위 내용은 CSV - Python에서 로컬 및 원격 파일 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.