Python处理CSV文件

简介: Python处理CSV文件

在数据处理过程中,可能会需要采用筛选、提取、重新生成等方法来对数据进行处理,下面以csv文件为例,介绍使用Python处理文本文件的方法。

开始之前

在面对文件读写类的问题时,open函数是一定绕不开的,下面先介绍几种open函数使用的技巧。

  • 使用with来处理上下文,可以在读/写完成后自动关闭文件
file_path = 'test.csv'
# bad
fp = open(file_path, 'r')
fp.read()
fp.close()
# good
with open(file_path, 'r') as fp:
    fp.read()
  • 对文件直接进行循环(文件本身就是一个可迭代对象,可以直接进行循环遍历)
# bad
with open(file_path, 'r') as fp:
    lines = fp.readlines()
    for index in range(lines):
        print(lines[index])
# good
with open(file_path, 'r') as fp:
    for line in fp:
        print(line)
  • 打开多个文件可以使用一个with
# bad
with open(file1, 'r') as fp1:
    with open(file2, 'w') as fp2:
        for line in fp1:
            fp2.write(line)
# good
with open(file1, 'r') as fp1, open(file2, 'w') as fp2:
    for line in fp1:
        fp2.write(line)

csv

csv文件是一类出现频率非常高的文本文件,在python中有许多方法可以读写他。下面介绍两种读写的方法。

在开始之前,先来介绍一下csv文件的格式,比如下面这个文件,里面有4行,第一行是表头或者叫列名(可以没有表头),每一列之间使用,隔开。后面3列是对应的内容,也是使用,进行隔开;每一行都是单独的,行与行之间使用\n进行分割,这个\n是一个不可见字符,作用是换行。

name,age,city
liming,12,taian
zhangsan,20,heze
lisi,18,shenzhen

读取

原生方法

原生方法是指不借助第三方库,只使用python本身来进行读写。

根据上面我们对csv文件的了解,我们可以得到下面这些信息

  • 第一行可能是表头,也可能直接就是数据
  • 列与列之间使用,进行分割
  • 行与行之间使用\n进行分割

下面来编写函数来进行解析csv文件,我们需要一个文件路径csv_file来进行读取,需要分隔符sep,来确定列与列之间是由什么来进行分割的,最后还需要一个header来控制是否在最后的数据中保留第一行(因为第一行可能是表头,不是真正的数据)

def parse_csv(csv_file, sep=',', header=False):
    result = []  # 存放最终的数据
    with open(csv_file, 'r') as fp:
        # 如果是True,那么可以跳过第一行
        if header:  
            fp.readline()  # 直接丢弃(读取)第一行
        for line in fp:
            result.append(line.split(sep))  # 根据sep来进行分割
    return result

Pandas

pandas是python中一个十分强大的数据分析工具,下面使用pandas来实现和上面代码一样的功能

import pandas as pd
result = pd.read_csv(csv_file, sep=',', header=None)  # 包括第一行
result = pd.read_csv(csv_file, sep=',')               # 不包括第一行

可以发现,两种方式的代码量相差很大,第二种方法几乎是一行代码就可以实现csv的读取。上面两种方法都是读取的操作,下面来介绍写入的操作

写入

原生方法

在写入的时候,我们只需要构造出符合csv文件格式的字符串,然后写入文件即可

将每一列的数据使用分隔符sep进行连接,将每一行之间的数据使用\n进行分割

data = [
 ['liming','12','taian'],
 ['zhangsan','20','heze'],
 ['lisi','18','shenzhen'],
]
def write_csv(data, output_file, sep=','):
    with open(output_file, 'w') as fp:
        for line in data:
            # 使用sep将每一行中的数据连接起来
            # 同时在最后加上\n来进行换行
            fp.write(sep.join(line) + '\n')

pandas

import pandas as pd
data = [
   ['liming', '12', 'taian'],
   ['zhangsan', '20', 'heze'],
   ['lisi', '18', 'shenzhen'],
]
df = pd.DataFrame(data)  # 需要先构造一个数据表
# 把构造的数据表存下来,不存表头,不存索引
df.to_csv(output_file, header=None, index=None)

下面我将从一个具体的案例来讲述如何使用python来完成文本处理的任务。

案例讲解

需求

有一个csv文件,第一列是gene_id,第二列是表达量

c085bcd30cc980d5f8bed2ba3c83d168_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

现在你需要在里面筛选20个特定的基因,同时根据另一个文件为这20个gene_id重命名

20613d229973134c65a8870ee5020ab2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

最后将筛选出来的gene_idexpression保存到一个新的csv文件里面

实现

下面我们也是使用两种方法来完成这个需求

原生方法

def get_geneid_map(geneid_map_csv):
    """ 将第二个csv文件转化从dict中,旧id做key,新id做value """
    result = {}
    with open(geneid_map_csv,'r') as fp:
        fp.readline()  # 去掉表头
        for line in fp:
            line = line.strip('\n')    # 去掉最后的\n
            line = line.split(',')     # 根据,进行分割
            result[line[0]] = line[1]  # 存到字典里面
    return result
def parse_gene_file(gene_file,geneid_map_dict):
    result = []
    with open(gene_file,'r') as fp:
        fp.readline()  # 去掉表头
        for line in fp:
            line = line.strip('\n')
            line = line.split(',')
            if line[0] in geneid_map_dict:
                result.append([
                    geneid_map_dict[line[0]],  # 根据旧id获得新id
                    line[1]  # 表达量
                ])
    return result
def save_to_csv(result,output_file):
    with open(output_file,'w') as fp:
        for line in result:
            fp.write(','.join(line) + '\n')
if __name__ == '__main__':
    csv_file1 = 'gene.csv'
    csv_file2 = 'geneid_map.csv'
    csv_result = 'filter.csv'
    geneid_map = get_geneid_map(csv_file2)
    result = parse_gene_file(csv_file1,geneid_map)
    save_to_csv(result,csv_result)

pandas

if __name__ == '__main__':
    csv_file1 = 'gene.csv'
    csv_file2 = 'geneid_map.csv'
    csv_result = 'filter.csv'
    import pandas as pd
    # 读取csv文件,数据不包含header
    gene = pd.read_csv(csv_file1,sep=',')
    geneid = pd.read_csv(csv_file2,sep=',')
    # 使用isin筛选需要的id,同时拷贝一份
    filter_gene = gene[gene['gene_id'].isin(geneid['gene_id1'])].copy() 
    # 构造字典,与上面构造的字典相同
    geneid_map = {v['gene_id1']:v['gene_id2'] for k,v in geneid.to_dict('index').items()}
    # 使用字典对旧id进行替换
    filter_gene['gene_id'] = filter_gene['gene_id'].map(geneid_map)
    # 保存csv,不包含表头,不包含索引
    filter_gene.to_csv(csv_result,header=None,index=None)

后台回复csv即可获得案例中使用的文件

目录
打赏
0
0
0
0
33
分享
相关文章
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
27天前
|
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
131 69
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
178 83
Python文件打包:一站式指南
本文深入探讨Python文件打包的各种方法,从基础的zip和tar工具到高级的setuptools、PyInstaller、cx_Freeze等,涵盖Docker镜像、虚拟环境及自包含可执行文件的打包方式。通过示例代码与详细解析,帮助开发者根据项目需求选择合适的打包方案,提升代码分发与部署效率。内容全面,适合各水平读者学习参考。
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
88 20
如何在Python中高效地读写大型文件?
大家好,我是V哥。上一篇介绍了Python文件读写操作,今天聊聊如何高效处理大型文件。主要方法包括:逐行读取、分块读取、内存映射(mmap)、pandas分块处理CSV、numpy处理二进制文件、itertools迭代处理及linecache逐行读取。这些方法能有效节省内存,提升效率。关注威哥爱编程,学习更多Python技巧。
123 8
如何使用 Python 进行文件读写操作?
大家好,我是V哥。本文介绍Python中文件读写操作的方法,包括文件读取、写入、追加、二进制模式、JSON、CSV和Pandas模块的使用,以及对象序列化与反序列化。通过这些方法,你可以根据不同的文件类型和需求,灵活选择合适的方式进行操作。希望对正在学习Python的小伙伴们有所帮助。欢迎关注威哥爱编程,全栈路上我们并肩前行。
109 4
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等