读取CSV文件,格式化显示文件内容

本文详细介绍了解析CSV文件的两种常见方法:将数据转换为字典列表和将数据组织成键值对字典。通过具体代码实例,展示了如何读取CSV文件的表头,逐行处理数据,并最终形成所需的数据结构。

CSV文件内容

在这里插入图片描述

输出格式1

输出结果: L: [{'name': '张三', 'age': '27', 'sex': '男'}]

附上代码:

with open('CSV.csv','r') as f:
    keys = f.readline().strip().split(',')#代表了第一行数据(表头)
    L = []
    # d=f.readlines()
    for x in f.readlines():
        dict_ = {}
        line = x.strip().split(',')
        for i in range(len(keys)):
            dict_[keys[i]] = line[i]
        L.append(dict_)
print(L)

代码分析:
1.keys是通过读取csv文件第一行获取表头数据(readline()一次只读取一行数据,strip()作用于字符串,在此处可以去除空格,split()可以按规定的分隔符进行分隔字符串,使其变成列表)
2.d是通过readlines()将剩余的CSV文件一次性全部读入,每一行数据作为列表的元素
3.通过对d的遍历,获取每一行的数据,然后通过line变量(列表类型),获取每一行的每一个数据
4.通过想要达到的效果,我们知道,一行数据是单独占领一个dict_的,每行数据在加入dict_后(循环结束后),应该要将其append到L列表中

注意点:
1.如果你在程序中插入读的相关操作,那么你会影响文件指针的指向,影响下面程序读取文件数据

输出格式2

输出结果:  dict_={'name': ['张三',  '王五'], 'age': ['27',  '23'], 'sex': ['男',  '男']}

附上代码:

with open('CSV.csv','r') as f:
    keys = f.readline().strip().split(',')
    L = []
    dict_ = {}
    for x in f.readlines():  #循环1
        line = x.strip().split(',')
        for i in range(len(keys)):#循环2
            L.append (line[i])#截取到各行的数据
    for i in  range(len(keys)):#循环3
        dict_[keys[i]] = L[i::len(keys)]
    print(dict_)

代码分析:
1.整个程序的思路很清晰,将每行的数据(3个子数据)全部都放在L中,然后使用切片做成我们想要的效果(真的很巧妙!)
2. L在整个程序运行完后的结果:[‘张三’, ‘27’, ‘男’, ‘李四’, ‘24’, ‘女’, ‘王五’, ‘23’, ‘男’]
3.循环1读取除表头外的每行数据
4.循环2中的L每次都将每行的数据append进来
5.循环3就是利用切片将L中的姓名,年龄,性别分别切出来,对应地放在dict_中相应的键中(keys[i])中

# solution 2: 第二种打印形式
def operate_file(filepath):
    with open(filepath, 'r', encoding='UTF-8') as f:
        keys = f.readline().strip().split(',')  # keys 是其中的表中的字段,用strip来去除每行末尾的换行符
        dic, n = {}, 0  # dic用来存放最终数据,n控制读取表字段的累加器

        """
        1. 利用双重循环达到1×3(1个name键下有3个名字)的匹配结果
        2. 散列表是无序的,不能保证按顺序读入表中字段(好像不影响)
        3. 做了很多无用功,每次values循环只能填写字典中的一个键的所有取值,然后重新定位到第二行
        4. 刚开始的错误, 遍历keys时,因为它是最外层循环,so 必须等里头的循环执行完毕才能遍历下一个key,导致dic[key] 在values 和n都改变的情况下,key还是不变
        5. 因为values 遍历一遍后f就指向文件末尾,需要重新定位到第二行,不然遍历f始终为空
        """

        for key in keys:
            dic[key] = []
            for values in f:  # 每次的values 都是一行数据,也就是说a 是每一行列表数据的第n个元素
                a = values.strip().split(',')[n]
                dic[key].append(a)  # 其中的key 正好对应 元素a
            n += 1  # 因为要读取每一行的不同下标的元素,so此处n需要加1
            f.seek(13, 0)  # 文件定位到第二行的第一个元素,以提供给最近一层的for循环遍历f
            # 第一个参数:偏移量,第二个参数:指针位置
    return dic

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值