【问题标题】:How can I read and process 100 bytes at a time from a large CSV file?如何从大型 CSV 文件中一次读取和处理 100 个字节?
【发布时间】:2019-12-05 22:42:26
【问题描述】:

下面的csv只是我主要数据文件的一个sn-p。

customer.csv

customer_id,order_id,number_of_items
10,4736,9
5,3049,1
1,4689,3
6,4114,9
1,4524,15
2,3727,16
3,3507,7
7,3988,3
5,4993,16
6,1945,4
7,3081,7
3,3707,2
5,1739,12
9,4167,17
7,3242,12
2,3109,10
10,2197,20
10,3528,13
8,4917,2
5,1713,19
8,4224,4
7,2160,2
10,2044,19
10,2956,8
3,3906,2
5,2288,16
7,1854,20
7,4404,2
9,1622,2
7,3685,2
10,2755,10
3,3390,10
6,1424,6
3,2127,15
4,1221,15
9,2994,14
1,1413,13
7,2771,7
3,4579,13
10,2208,4

我目前拥有的一切

import os
os.path.getsize("customer.csv") # outputs, 424 bytes

我认为我需要如何继续

我想我需要打开 csv 并读取字节?然后按位看每一行?

请注意,我并不是专门找人来回答我如何做到这一点(尽管我将不胜感激)。因此,如果有人能指出我正确的方向或给我一些研究主题,那就太好了。旁注,我知道我应该在某处使用编码和解码来完成这项任务。

【问题讨论】:

  • 您要解析 csv 文件吗? Python 标准库中有 csv 模块 - docs.python.org/3/library/csv.html
  • 正确。我知道 csv 模块,但我不确定如何在检查每行是否有必要的字节信息时只读取 100 个字节。解析 CSV 的目的是构建一个包含唯一客户 ID(键)和他们购买的平均商品数量(价值)的字典。
  • 我不明白,为什么一次只需要读取 100 个字节?这对我来说听起来像是 X-Y 问题......
  • 我也不确定..在查看@AndrejKesely 回答并运行print(sys.getsizeof(data)) 后输出 56 个字节。这是每行的大小吗?还是整个数据集?我正在做的作业逐字记录:存储空间对于这项作业很重要;因此,将上述数字(使用位运算)组合成每个客户的单个整数,稍后可以将其分解为上述数字。请提供编码和解码值的函数。
  • @TonyPendleton sys.getsizeof 以字节为单位返回您传递给它的对象的大小(但不是 it 引用的对象,即它不会递归地给您对象图的总大小)。所以data 是一个csv.DictReader 对象,它需要56 个字节。这既不是每行的大小,也不是整个数据集的大小。老实说,sys.getsizeof 在这里对你没有用处。

标签: python-3.x csv parsing sys


【解决方案1】:

此脚本将使用csvcustomer.csv 加载数据并使用内置statistics 模块计算平均值:

import csv
from statistics import mean

with open('customer.csv', newline='') as csvfile:
    data = csv.DictReader(csvfile)

    # group the customers by customer_id
    customers = {}
    for order in data:
        customers.setdefault(order['customer_id'], []).append(int(order['number_of_items']))

    # print the `average`:
    print('{:<15} {}'.format('customer_id', 'average'))
    for k, v in customers.items():
        print('{:<15} {:.2f}'.format(k, mean(v)))

打印:

customer_id     average
10              11.86
5               12.80
1               10.33
6               6.33
2               13.00
3               8.17
7               6.88
9               11.00
8               3.00
4               15.00

【讨论】:

    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多