高效Go编程: encoding/csv标准库深度解析

高效Go编程: encoding/csv标准库深度解析

    • 引言
    • 了解encoding/csv库
      • CSV文件的基本结构
      • encoding/csv库的核心功能
      • 应用场景
    • 读取CSV文件
      • 基本步骤
      • 代码示例
      • 处理不同的分隔符
      • 错误处理
    • 处理CSV数据
      • 数据解析
      • 代码示例
      • 处理不规则数据
      • 代码示例
    • 写入CSV文件
      • 基本步骤
      • 代码示例
      • 自定义设置
      • 错误处理
    • 高级应用
      • 使用结构体映射数据
        • 代码示例
      • 处理大型CSV文件
        • 代码示例
    • 错误处理和调试
      • 错误处理策略
      • 代码示例
      • 调试技巧
    • 案例研究
      • 场景描述
      • 步骤分解
      • 代码示例
    • 总结
      • 主要学习点
      • 结论

在这里插入图片描述

引言

在当今数据驱动的编程世界中,CSV(逗号分隔值)格式的数据无处不在。它简单、灵活,被广泛应用于数据导入、导出和分析。Go语言,以其高效和简洁著称,提供了encoding/csv库,专门用于处理CSV格式的数据。这个库不仅简化了读取和写入CSV文件的过程,还支持定制化和高级数据操作,非常适合中级和高级开发者在实际开发中使用。

本文将详细介绍如何利用Go的encoding/csv库来高效处理CSV数据。我们将从基础的读取和写入操作开始,逐步深入到更高级的数据处理技巧。通过实际的代码示例和案例分析,本文旨在帮助开发者全面掌握encoding/csv库的强大功能,从而在实际项目中灵活运用。

接下来,让我们首先了解encoding/csv库的基本功能和应用场景。

了解encoding/csv库

Go语言的encoding/csv库是标准库的一部分,专门用于处理CSV格式的数据。它提供了一系列方便的API,使得读取和写入CSV文件变得简单高效。在深入编码之前,了解这个库的基本功能和应用场景对于有效地利用它至关重要。

CSV文件的基本结构

CSV文件主要由以逗号分隔的文本数据组成。每一行代表一个数据记录,每个记录可以包含多个字段,字段之间以逗号(,)分隔。例如:

姓名,年龄,职业
张三,30,软件工程师
李四,28,数据分析师

encoding/csv库的核心功能

  1. 读取CSV文件encoding/csv允许您轻松读取CSV文件,将每行数据转换为字符串切片。
  2. 写入CSV文件:同样地,这个库也支持将数据写入CSV格式的文件。
  3. 自定义分隔符:虽然标准的CSV使用逗号作为分隔符,但encoding/csv库允许自定义分隔符,增加了处理不同格式CSV文件的灵活性。
  4. 支持多种字符编码:可以处理不同字符编码的CSV文件,例如UTF-8或GBK。

应用场景

encoding/csv库的应用场景非常广泛,包括但不限于:

  • 数据导入和导出:在Web应用中常常需要导出或导入CSV格式的数据。
  • 数据分析:数据科学家和分析师经常使用CSV格式来存储和处理数据。
  • 自动化脚本:自动化处理CSV格式的日志文件或报告。

接下来,我们将探讨如何使用encoding/csv库来读取CSV文件,并提供实际的代码示例。

读取CSV文件

读取CSV文件是encoding/csv库的基础功能之一。在Go中读取CSV文件不仅简单,而且可以高度定制化,以适应不同的数据格式和需求。下面,我们将通过实际的代码示例来展示如何使用Go语言读取CSV文件。

基本步骤

  1. 打开CSV文件:首先,我们需要使用Go的标准库函数os.Open来打开一个CSV文件。

  2. 创建CSV阅读器:接着,利用csv.NewReader函数创建一个CSV文件的阅读器。

  3. 逐行读取数据:使用ReadReadAll方法来逐行读取CSV文件中的数据。

代码示例

下面是一个基本的例子,展示了如何读取一个CSV文件:

package mainimport ("encoding/csv""fmt""os"
)func main() {// 打开CSV文件file, err := os.Open("example.csv")if err != nil {fmt.Println("Error:", err)return}defer file.Close()// 创建CSV阅读器reader := csv.NewReader(file)// 逐行读取数据for {record, err := reader.Read()if err != nil {break}fmt.Println(record)}
}

这段代码将会打开一个名为example.csv的文件,并逐行打印出其中的数据。

处理不同的分隔符

有时候,CSV文件可能使用不同的分隔符(如分号;)。encoding/csv库允许你自定义分隔符来适应这些情况。例如:

reader.Comma = ';'

这样设置后,阅读器会将分号作为字段分隔符来解析CSV文件。

错误处理

处理CSV文件时,错误处理也非常重要。例如,当到达文件末尾或遇到格式错误时,Read方法会返回错误。合理的错误处理可以确保程序的健壮性和可靠性。

在下一部分,我们将探讨如何处理和解析CSV数据,并提供相应的代码示例。

处理CSV数据

一旦成功读取了CSV文件的数据,下一步就是对这些数据进行处理和解析。在Go语言中,encoding/csv库提供了灵活的方式来处理各种复杂的CSV数据格式。我们将通过代码示例来展示如何进行这些操作。

数据解析

在读取CSV数据后,通常需要将这些数据转换为更有用的格式。例如,你可能需要将字符串数据转换为整数、浮点数或其他类型。

代码示例

假设我们有一个CSV文件,其中包含用户的姓名和年龄,我们想要将姓名保持为字符串,将年龄转换为整数:

package mainimport ("encoding/csv""fmt""os""strconv"
)func main() {file, err := os.Open("users.csv")if err != nil {fmt.Println("Error:", err)return}defer file.Close()reader := csv.NewReader(file)for {record, err := reader.Read()if err != nil {break}name := record[0]age, err := strconv.Atoi(record[1])if err != nil {fmt.Println("Error converting age:", err)continue}fmt.Printf("Name: %s, Age: %d\n", name, age)}
}

这个例子中,我们使用strconv.Atoi函数将年龄从字符串转换为整数。

处理不规则数据

有时,CSV文件中的数据可能不规则或包含错误。例如,某些行可能缺少某些字段,或者数据格式可能不正确。在这种情况下,合理的错误处理和数据验证变得尤为重要。

代码示例

处理不规则数据的一个简单方法是检查每行数据的长度:

for {record, err := reader.Read()if err != nil {break}if len(record) < 2 {fmt.Println("Invalid record:", record)continue}// 数据处理逻辑
}

在这个例子中,如果一行数据的字段少于2个,我们将其视为无效记录并跳过处理。

在接下来的部分,我们将讨论如何使用encoding/csv库写入CSV文件,并提供相关的代码示例。

写入CSV文件

除了读取CSV文件外,encoding/csv库同样提供了写入CSV文件的功能。这对于生成报告、导出数据或任何需要将数据保存为CSV格式的场景都非常有用。在本节中,我们将探讨如何使用Go语言将数据写入CSV文件,并提供相应的代码示例。

基本步骤

  1. 创建或打开CSV文件:使用Go的os包创建或打开一个文件用于写入数据。
  2. 创建CSV写入器:利用csv.NewWriter函数创建一个CSV文件的写入器。
  3. 写入数据到CSV:使用WriteWriteAll方法将数据写入CSV文件。
  4. 刷新写入器缓存:确保所有数据都被正确写入到文件中。

代码示例

以下是一个简单的例子,演示了如何将数据写入CSV文件:

package mainimport ("encoding/csv""os"
)func main() {file, err := os.Create("output.csv")if err != nil {panic(err)}defer file.Close()writer := csv.NewWriter(file)defer writer.Flush()records := [][]string{{"姓名", "年龄", "职业"},{"张三", "30", "软件工程师"},{"李四", "28", "数据分析师"},}for _, record := range records {if err := writer.Write(record); err != nil {panic(err)}}
}

在这个例子中,我们创建了一个名为output.csv的新文件,并写入了几行数据。

自定义设置

encoding/csv库允许你自定义CSV的写入行为,例如更改字段分隔符、行结束符等。例如,要将字段分隔符更改为分号(;),可以这样设置:

writer.Comma = ';'

错误处理

和读取操作一样,写入CSV文件时也需要注意错误处理。确保在写入过程中正确处理任何可能出现的错误,以确保数据的完整性和程序的稳定性。

接下来,我们将探讨一些高级应用技巧和最佳实践,帮助你更有效地使用encoding/csv库。

理解您的要求,我会提供一个更完整的代码示例来展示encoding/csv库的高级应用。我们将专注于使用结构体映射CSV数据,并处理大型CSV文件的技巧。

高级应用

使用结构体映射数据

当处理结构化的CSV数据时,使用结构体映射每一条记录是一个高效且清晰的方法。这种方法可以提高代码的可读性,并利用Go语言的强类型特性来增强数据处理的准确性。

代码示例

假设我们有一个包含用户信息的CSV文件,格式如下:

姓名,年龄,职业
张三,30,软件工程师
李四,28,数据分析师

我们可以创建一个对应的User结构体来映射这些数据:

package mainimport ("encoding/csv""fmt""os""strconv"
)// User 结构体用于映射CSV文件中的一行数据
type User struct {Name     stringAge      intJobTitle string
}// parseUser 将CSV记录解析为User结构体
func parseUser(record []string) (*User, error) {if len(record) != 3 {return nil, fmt.Errorf("invalid record length: %v", record)}age, err := strconv.Atoi(record[1])if err != nil {return nil, fmt.Errorf("invalid age: %s", record[1])}return &User{Name:     record[0],Age:      age,JobTitle: record[2],}, nil
}func main() {file, err := os.Open("users.csv")if err != nil {panic(err)}defer file.Close()reader := csv.NewReader(file)var users []*Userfor {record, err := reader.Read()if err != nil {break}user, err := parseUser(record)if err != nil {fmt.Println("Error parsing record:", err)continue}users = append(users, user)}// 打印解析后的用户信息for _, user := range users {fmt.Printf("%+v\n", *user)}
}

这个程序首先定义了一个User结构体,然后使用parseUser函数将CSV记录解析为User对象。在主函数中,我们读取CSV文件,并将每行数据解析为User结构体的实例。

处理大型CSV文件

处理大型CSV文件时,考虑到内存和性能问题,建议使用流式处理。这意味着逐行读取文件,而不是一次性将整个文件加载到内存中。

代码示例

在上面的例子中,我们已经使用了流式处理方法。通过使用csv.NewReader和逐行读取的方式,我们可以有效地处理大型文件,而不会耗尽内存资源。

for {record, err := reader.Read()if err != nil {break}// 处理每行记录的代码
}

这种方法在处理大型CSV文件时非常有效,因为它只在任何给定时间占用少量内存,并且可以逐行处理数据。

结合这些高级技巧,你现在应该能够更有效地使用encoding/csv库来处理各种复杂和大型的CSV文件了。

错误处理和调试

处理CSV文件时,正确的错误处理和有效的调试是保证数据准确性和程序稳定性的关键。encoding/csv库在处理文件时可能会遇到各种错误,例如格式错误、文件读取错误等。在这一节中,我们将讨论如何进行错误处理和调试,以确保您的CSV处理逻辑是健壮和可靠的。

错误处理策略

  1. 预期错误处理:处理文件不存在、无法打开或读取错误等预期内的错误。
  2. 意外错误处理:处理意外的数据格式错误、解析错误等。
  3. 记录和报告错误:合理地记录错误信息,方便调试和问题追踪。

代码示例

以下是一个扩展的错误处理和调试的示例:

package mainimport ("encoding/csv""fmt""os"
)func main() {file, err := os.Open("users.csv")if err != nil {fmt.Printf("Error opening file: %v\n", err)return}defer file.Close()reader := csv.NewReader(file)lineNumber := 0for {record, err := reader.Read()if err != nil {if err == csv.ErrFieldCount {fmt.Printf("Warning: wrong number of fields at line %d\n", lineNumber)} else if err == csv.ErrQuote {fmt.Printf("Warning: quote error at line %d\n", lineNumber)} else {fmt.Printf("Error reading CSV at line %d: %v\n", lineNumber, err)break}}lineNumber++// 处理记录的代码}
}

在这个例子中,我们处理了各种可能的错误情况,并添加了行号信息以帮助定位错误发生的位置。

调试技巧

  1. 增加日志输出:在关键步骤增加日志输出,可以帮助您跟踪数据处理的流程和状态。
  2. 使用调试器:如果您的开发环境支持,使用调试器可以逐步执行代码,检查变量状态,这对于发现和解决问题非常有用。
  3. 单元测试:编写单元测试可以帮助您验证代码逻辑的正确性,并在未来的开发中防止回归错误。

通过实施这些错误处理和调试策略,您可以确保您的CSV数据处理逻辑更加健壮和可靠。下一部分,我们将通过一个案例研究来展示encoding/csv库在实际应用中的使用。

案例研究

为了更好地理解encoding/csv库在实际开发中的应用,我们将通过一个具体的案例研究来展示它的实用性。假设我们需要开发一个程序,该程序读取一个包含员工数据的CSV文件,并根据某些条件筛选和统计数据,最后输出结果到另一个CSV文件。

场景描述

我们的CSV文件employees.csv包含以下字段:姓名部门入职年份。我们的目标是找出在特定部门工作,并且入职年份超过5年的员工。

步骤分解

  1. 读取CSV文件:读取employees.csv文件中的员工数据。
  2. 筛选数据:根据部门和入职年份筛选员工。
  3. 统计和处理数据:对筛选后的数据进行必要的统计和处理。
  4. 输出结果:将处理后的数据输出到新的CSV文件。

代码示例

package mainimport ("encoding/csv""fmt""os""strconv""time"
)// Employee 结构体用于映射员工数据
type Employee struct {Name       stringDepartment stringJoinYear   int
}// parseEmployee 将CSV记录解析为Employee结构体
func parseEmployee(record []string) (*Employee, error) {joinYear, err := strconv.Atoi(record[2])if err != nil {return nil, fmt.Errorf("invalid join year: %s", record[2])}return &Employee{Name:       record[0],Department: record[1],JoinYear:   joinYear,}, nil
}func main() {file, err := os.Open("employees.csv")if err != nil {fmt.Println("Error opening file:", err)return}defer file.Close()reader := csv.NewReader(file)var employees []*Employeefor {record, err := reader.Read()if err != nil {break}employee, err := parseEmployee(record)if err != nil {fmt.Println("Error parsing record:", err)continue}employees = append(employees, employee)}// 筛选员工数据var selectedEmployees []*EmployeecurrentYear := time.Now().Year()for _, employee := range employees {if employee.Department == "IT" && (currentYear-employee.JoinYear) > 5 {selectedEmployees = append(selectedEmployees, employee)}}// 输出筛选结果到新的CSV文件outputFile, err := os.Create("selected_employees.csv")if err != nil {panic(err)}defer outputFile.Close()writer := csv.NewWriter(outputFile)defer writer.Flush()for _, employee := range selectedEmployees {if err := writer.Write([]string{employee.Name, employee.Department, strconv.Itoa(employee.JoinYear)}); err != nil {panic(err)}}
}

在这个例子中,我们首先定义了一个Employee结构体来映射CSV中的数据。然后,我们读取CSV文件,将每行数据解析为Employee对象。接下来,我们根据部门和入职年份筛选员工,并将筛选结果写入新的CSV文件中。

通过这个案例,我们可以看到encoding/csv库在实际项目中如何用于处理和分析数据。这只是一个简单的例子,但它展示了Go语言在数据处理方面的强大能力。

总结

通过本文的深入探讨和案例研究,我们了解了Go语言中encoding/csv库的强大功能和应用。从基本的读写操作到高级的数据处理技巧,encoding/csv库证明了其在处理CSV数据方面的高效性和灵活性。以下是我们所学内容的总结:

主要学习点

  1. 基础操作:我们探讨了如何使用encoding/csv库进行基本的CSV文件读写操作,这是处理CSV数据的基石。

  2. 数据处理:通过将CSV数据映射到结构体、错误处理、以及动态数据处理,我们展示了在实际应用中处理复杂CSV数据的方法。

  3. 高级应用:我们学习了一些高级技巧,比如使用结构体映射数据、处理大型CSV文件,以及合理的错误处理和调试策略,这些都是提高开发效率和代码质量的关键。

  4. 实际案例:通过一个实际的案例研究,我们展示了如何将学到的知识应用于实际问题解决中,强化了理论与实践的结合。

结论

无论是在数据导入/导出、数据分析还是自动化脚本开发中,Go语言的encoding/csv库都是一个非常有用的工具。它的简洁性、灵活性和强大的功能使得处理CSV数据变得简单而高效。通过本文的学习,开发者们应该能够更加自信地在自己的项目中使用这个库来处理各种CSV数据。

希望这篇文章能帮助你理解并有效地使用Go的encoding/csv库。不论你是在处理小型的数据集还是大型的CSV文件,它都将是你强大的工具之一。记住,实践是学习的最好方式,不断尝试和探索将帮助你更深入地理解和掌握这些概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue组件之间的通信方式

文章目录 组件间通信的概念组件间通信的分类组件间通信的方案父组件将方法传递给子组件&#xff08;props&#xff09;子组件向父组件传值(emit)通过 ref 属性获取DOM元素EventBus p a r e n t 或 parent 或 parent或 root a t t r s 与 attrs 与 attrs与 listeners provide 与…

Kotlin编程权威指南学习知识点预览

一、变量、常量和类型&#xff1a; 变量、常量以及 Kotlin 基本数据类型。变量和常量在 应用程序中可用来储值和传递数据。类型则用来描述常量或变量中保存的是什么样的数据。 1、声明变量: // 变量定义关键字 —— 变量名 —— 类型定义 —— 赋值运算符 —— 赋值var na…

cesium wall 扩散墙(动态立体墙效果 Primitive 方法)

cesium wall 扩散墙(动态立体墙效果)以下为源码直接复制可用 1、实现思路 1、此效果运用cesium 中 Primitive 方法,通过传入中心点、半径、顶点数、颜色来进行加载。 2、运用 Math 方法 对传进来的中心点、半径、定点数,来计算个顶点经纬度。 3、通过Primitive 方法中upda…

643.子数组最大平均数

题目&#xff1a;给你一个由 n 个元素组成的整数数组 nums 和一个整数k。 找出平均数最大且长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于10^-5 的答案都将被视为正确答案。 解题思路&#xff1a;规定了子数组的长度为k&#xff0c;因此可以通过寻找子…

洛谷——P1352 没有上司的舞会

题目描述 某大学有 n 个职员&#xff0c;编号为1…n。 他们之间有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。 现在有个周年庆宴会&#xff0c;宴会每邀请来一个职员都会增加一定的快乐指数 ri​&#xff0c;但…

【MySQL】深入解析索引实现原理

文章目录 1、索引介绍2、索引分类2.1、数据结构HashB Tree 2.2、存储方式聚簇索引非聚簇索引 2.3、功能特性主键索引唯一索引普通索引 2.4、字段数量单列索引多列索引 3、最佳实践3.1、索引覆盖3.2、回表操作3.3、最左匹配原则3.4、索引下推 1、索引介绍 对于MySQL数据库来说…

笔试题:小红的循环小数 数论 欧拉 快速幂 小费马定理

小红的循环小数 众所周知&#xff0c;所有的无限循环小数都可以写成分数的形式 小红想让你判断循环节长度为k的无限循环小数的分母是否可能是p。你能帮帮她吗&#xff1f; 共有q次询问。 输入描述 第一行输入一个正整数 q q q&#xff0c;代表询问次数。 接下来的 q q q行&…

Tensorflow笔记(二):常用函数2、激活函数、优化器等、神经网络模型实现(商品销量预测)

import tensorflow as tf import numpy as np from tqdm import tqdm# ----------------------------- tensor常用函数2 ----------------------------------- a tf.constant([1, 2, 3, 1, 2]) b tf.constant([0, 1, 3, 4, 5]) c tf.where(tf.greater(a, b), a, b) # 若a&g…

计算机毕业设计-springboot+vue前后端分离电竞社交平台管理系统部分成果分享

4.5系统结构设计 本系统使用的角色主要有系统管理员、顾客、接单员&#xff0c;本系统为后台管理系统&#xff0c;游客用户可以经过账号注册&#xff0c;管理员审核通过后&#xff0c;用账号密码登录系统&#xff0c;查看后台首页&#xff0c;模块管理&#xff08;顾客信息&am…

mysql重构

力扣题目链接 列转行 SELECT product_id, store1 store, store1 price FROM products WHERE store1 IS NOT NULL UNION SELECT product_id, store2 store, store2 price FROM products WHERE store2 IS NOT NULL UNION SELECT product_id, store3 store, store3 price FROM p…

全栈的自我修养 ———— js中的复制api

通常用于可以禁止用户复制或者在复制的内容后面添加版权信息等 一、代码二、展示1、访问粘贴板的内容2、替换复制内容3、在复制内容的后面添加版权信息4、监听粘贴事件 一、代码 <body><div class"demo">不可以被复制</div><div class"de…

如何从任何文档生成指令数据集以进行LLM微调

使用轻量级库经济地生成高质量的合成数据集 大型语言模型 &#xff08;LLMs&#xff09; 是功能强大的通用工具&#xff0c;但它们通常缺乏特定于领域的知识&#xff0c;这些知识通常存储在企业存储库中。 使用您自己的数据微调自定义LLM可以弥合这一差距&#xff0c;而数据准…

【Shiro反序列化漏洞】Shiro-550反序列化漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

了解下索引的几棵树?

二叉树 二叉搜索树最好的情况性能是O(logn)&#xff0c;最坏情况是O(n) 红黑树 它的时间复杂度是O(logn)&#xff0c;但是在数据量特别大的时候&#xff0c;树会特别高&#xff0c;就会遍历很多层级&#xff0c;对性能影响较大 BTree B树是一种多叉路衡查找树&#xff0c;相对于…

解决NVM安装Node失败:淘宝NPM镜像HTTPS证书到期及源切换指南

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

如果利用AOP/Aspect来修改方法的入参

问题描述&#xff1a; 最近项目代码过三方测试&#xff08;国企项目&#xff09;&#xff0c;在一系列代码扫描审计检查下&#xff0c;代码发现一部分修改&#xff0c;例如请求参数发生了编码/加密&#xff0c;导致后台需要对请求的参数进行解码/解密&#xff0c;后端那么接口&…

访问者模式(Visitor Pattern)

访问者模式 说明 访问者模式&#xff08;Visitor Pattern&#xff09;属于行为型模式&#xff0c;表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 该模式是将数据结构与数据操作分离的设计模式&#xff0c;是…

Flutter 多语言、主题切换之GetX库

多语言、主题切换之GetX库 前言正文一、配置项目二、模拟UI三、语言配置① 常量键② 语言配置文件③ 配置 四、持久化五、切换语言① my_home.dart② home.dart③ mine_controller.dart④ language_setting_controller.dart⑤ language_setting.dart⑥ mine.dart 六、切换主题①…

基于SpringBoot的“家政服务管理平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“家政服务管理平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 服务信息界面…

WorldGPT、Pix2Pix-OnTheFly、StyleDyRF、ManiGaussian、Face SR

本文首发于公众号&#xff1a;机器感知 WorldGPT、Pix2Pix-OnTheFly、StyleDyRF、ManiGaussian、Face SR HandGCAT: Occlusion-Robust 3D Hand Mesh Reconstruction from Monocular Images We propose a robust and accurate method for reconstructing 3D hand mesh from m…