【问题标题】:Using CSV arrays as an input to Python使用 CSV 数组作为 Python 的输入
【发布时间】:2011-12-29 21:16:37
【问题描述】:

我收到了一个 csv 文件,其中包含 100 多个数组,我需要运行我的数据分析代码,但我不知道如何在 Python 中读取这些数组。每个数组前面都有一行,该行仅包含一个整数,该整数给出数组中的行数,并以用作行分隔符的行 '1234567890' 结束。

这是 csv 文件的 sn-p:

7,,,,,,,  
1,-199.117,-105.4,-4.525,227.5415,225.2925647,-0.0198891,-2.6547518
2,133.0423,55.4573,-48.4174,155.16,144.1380093,-0.322813,0.3949385
3,129.8405,-16.9527,-303.3192,331.0847,130.9425427,-1.5644458,-0.1298311
4,-73.6373,71.4677,151.517,183.9712,102.616198,1.1678785,2.3711453
5,41.2654,10.4196,30.3773,54.0915,42.5605604,0.6351541,0.2473322
6,-20.3159,-32.4484,62.4574,74.8581,38.2836056,1.2022641,-2.1301853
7,-13.2904,22.029,-28.2895,38.5096,25.7276422,-0.9386666,2.1136489  
1234567890,,,,,,,  
5,,,,,,,  
1,-136.0755,-204.2787,-48.2127,259.2592,245.4512762,-0.1881526,-2.158425
2,220.5184,46.9388,-113.6448,265.1745,225.4586784,-0.4581388,0.2097266
3,-45.3132,169.6283,-49.2729,188.9506,175.576326,-0.2669358,1.8318334
4,-40.7141,34.7414,25.5414,60.9535,53.5219844,0.4465159,2.4351851
5,15.3863,-49.6703,17.1692,56.7635,51.9988166,0.312235,-1.2704018  
1234567890,,,,,,,  
6,,,,,,,   
1,-19.3083,295.4128,191.8666,360.3712,296.0431267,0.5935079,1.6360639
2,-169.8708,-128.3904,-1.0052,215.4187,212.9323449,-0.0046663,-2.4943822
3,15.4505,-209.6656,-178.0715,279.4077,210.2341118,-0.7536439,-1.4972381
4,172.4142,13.0485,-63.7912,192.2842,172.9072576,-0.3447988,0.0755371
5,16.7456,24.8768,-46.5025,55.9188,29.9878358,-1.1933262,0.9783247
6,-8.911,4.1138,12.7751,17.7283,9.8147477,0.9089022,2.7090895  
1234567890,,,,,,,

如果 csv 只是一个大数组,我确信我可以导入该数组,但在从众多数组中挑选一个数组时我很难过。数据分析需要在临时数组上运行,然后才能替换为 csv 文件中的下一个数组。

【问题讨论】:

  • 你看过csv module了吗?它非常易于使用。你到底卡在哪里了?
  • 如果 csv 文件只是一个大数组,那么 csv 模块对我很有帮助,但我不知道如何只选择一个数组,进行数据分析,然后他们继续下一个数组。
  • 呃,您只需遍历从csv.reader(myfile) 获得的对象。我没看到问题。

标签: python arrays loops csv ascii


【解决方案1】:

这应该会为您提供一个格式良好的变量,称为“数据”。

import csv
rows = csv.reader(open('your_file.csv'))

data = []
temp = []

for row in rows:
    if '1234567890' in row:
        data.append(temp)
        temp = []
        continue
    else:
        temp.append(row)

if temp != []:
    data.append(temp)

【讨论】:

    【解决方案2】:

    您可以使用itertools.groupby 将行解析为单独的数组:

    import csv
    import itertools
    
    with open('errors','w') as err: pass
    with open('data','r') as f:
        for key, group in itertools.groupby(
                csv.reader(f),
                lambda row: row[0].startswith('1234567890')):
            if key: continue  # key is True means we've reach the end of an array
            group=list(group) # group is an iterator; we turn it into a list
            array=group[1:]   # everything but the first row is data
            arr_length=int(group[0][0]) # first row contains the length
            if arr_length != len(array): # sanity check
                with open('errors','a') as err:
                    err.write('''\
    Data file claims arr_length = {l}
    {a}
    {h}
    '''.format(l=arr_length,a=str(list(array)),h='-'*80))
            print(array)
    

    itertools.groupby 返回一个迭代器。它遍历csv.reader(f) 中的行,并将lambda 函数应用于每一行。当行以'1234567890' 开头时,lambda 函数返回True。返回值(例如TrueFalse)称为key。重要的一点是itertools.groupby 将所有返回相同键的连续行收集在一起。

    【讨论】:

    • 这似乎运作良好!但是一旦进行完整性检查,它确实会遇到 AssertionError。 Traceback (most recent call last):File "CSV.py", line 12, in <module>assert arr_length == len(array) # sanity checkAssertionError
    • 这意味着数据文件包含数组,其中报告的数组长度不等于数组数据长度。我已经编辑了脚本,因此此类事件将记录在名为errors 的文件中。您可以在运行后查看那里以调查哪些数据包含错误。
    • if arr_length != len(array): report_errors()的路很长……try/except有什么隐藏的目的吗?
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2020-07-03
    • 2021-03-13
    • 1970-01-01
    • 2011-12-04
    • 2022-01-15
    • 2016-07-09
    • 1970-01-01
    相关资源
    最近更新 更多