首页 >后端开发 >Python教程 >CSV - 在 Python 中处理本地和远程文件

CSV - 在 Python 中处理本地和远程文件

WBOY
WBOY原创
2024-08-28 18:30:37508浏览

CSV - Process Local & Remote Files in Python

编码员们大家好!

本文介绍了一个开源工具,能够处理本地和远程 CSV 文件、加载和打印信息,然后将列映射到 Django 类型。当数据集变大、Excel 不支持自定义报告或通过数据表进行完整数据操作时,通常需要处理 CSV 文件,并且需要 API。
当前的功能列表可以进一步扩展,以将 CSV 文件映射到数据库表/模型并完全生成仪表板 Web 应用程序。

源代码:AppSeed 服务的 CSV 处理器部分(开源)


在开始讲解代码和用法之前,我们先总结一下工具的特点:

  • 加载本地和远程文件
  • 打印值
  • 打印检测到的列类型
  • 将映射类型打印到 Django 模型

按照 README 中的说明克隆项目源并使其可用后,可以通过 CLI 执行 CSV 解析器。安装完成后,我们可以使用以下一行调用 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 

此时,代码为我们提供了对 CSV 信息、数据类型以及 Django 对应数据类型的访问。该映射可以轻松扩展为任何框架,如 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 生成服务器端分页数据表进行样式设置

感谢您的阅读!

对于那些有兴趣做出贡献的人,请随时加入新的 AppSeed 平台并在 Discord 上与社区联系:

  • AppSeed - 面向开发者的开源平台
  • AppSeed 社区 - 3k+ Discord 成员

以上是CSV - 在 Python 中处理本地和远程文件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn