【问题标题】:Import CSV file and append to an array导入 CSV 文件并追加到数组
【发布时间】:2016-06-21 07:25:20
【问题描述】:

我有一个格式如下的 csv 文件:

Image Id,URL,Latitude,Longitude
17609472165,https://farm8.staticflickr.com/7780/17609472165_c44d9b5a0e_q.jpg,48.843226,2.31805
11375512374,https://farm6.staticflickr.com/5494/11375512374_66a4d9af6c_q.jpg,48.844166,2.376
24768920940,https://farm2.staticflickr.com/1571/24768920940_634cc06f43_q.jpg,48.844619,2.395897
9411072065,https://farm8.staticflickr.com/7368/9411072065_5e2083a32e_q.jpg,48.844666,2.3725
9996916356,https://farm3.staticflickr.com/2807/9996916356_640c493020_q.jpg,48.844666,2.3725
24281266199,https://farm2.staticflickr.com/1623/24281266199_bf63e25c23_q.jpg,48.844925,2.389616

我想导入这个文件,并为文件中的每一行附加一个点 lat 和 lon 到一个二维数组。我已经尝试过如下代码,但它不工作(或打印任何东西)并且给出错误“ValueError:除了连接轴之外的所有输入数组维度必须完全匹配”

import numpy

data  = open('dataset_import_noaddress', 'r')
A = []

for line in data:
    fields = line.strip().split(',')
    lat = fields[2]
    lon = fields[3]
    print lat
    print lon
    newrow = [lat, lon]
    A = numpy.vstack([A, newrow])

任何人都可以提出为什么这不起作用,或者更好地提出一个更好的方法来实现同样的事情。谢谢!

【问题讨论】:

    标签: python arrays csv numpy


    【解决方案1】:

    首先,您通常希望使用with open(filename, 'r') as ...: 格式。这样做的一个原因是,如果您遇到错误,文件将自动关闭。

    人们经常使用csv.reader 在 Python 中读取 csv 文件(尽管如果您使用的是 Pandas,也可以使用 pd.read_csv(...) 读取表格)。然后,您需要使用 for line in reader: 遍历阅读器。

    您正在获取单个变量并创建中间列表,对每一行使用 numpy.vstack。将所有内容聚合为一个列表,然后在整个列表上调用 vstack 会更有效。

    A.append(line[2:4]) 从给定行的列表中获取第三和第四项(例如 [48.843226, 2.31805])并将其附加到更大的列表 A。您应该首先确保该行在附加之前至少有四个值,跟踪坏线。

    一旦构建了 A,然后调用 vstack。

    import csv
    
    with open(filename, 'r') as f:
        A = []
        bad_lines = []
        reader = csv.reader(f)
        for line in reader:
            if len(line) == 4:
                A.append(line[2:4])
            else:
                bad_lines.append(line)
        A = np.vstack(A)
    

    【讨论】:

    • 您正在回答 OP 的问题...如果您给出了一些解释,这可能是一个值得赞许的体面答案。目前,它只是一个代码,我很想投反对票:-(
    【解决方案2】:

    所以,基本上你想要 csv 文件中的经纬度数据,对吗?我建议你使用pandas'read_csv(),这样就不需要逐行循环文件。 Pandas 可以一次处理所有列。

    import pandas as pd
    
    file_ = pd.read_csv("dataset_import_noaddress", sep = ',')
    A = np.array(file_[["Latitude", "Longitude"]])
    print A
    

    array([[ 48.843226, 2.31805 ], [ 48.844166, 2.376 ], [ 48.844619, 2.395897], [ 48.844666, 2.3725 ], [ 48.844666, 2.3725 ], [ 48.844925, 2.389616]])

    【讨论】:

      【解决方案3】:

      您只想将您的 csv 读入一个矩阵,其中包含每行纬度、经度。所以基本上阅读,它删除前 2 列

      代码

      import numpy as np
      
      input = np.genfromtxt(open("dataset.csv","rb"),delimiter=",", skip_header=1)
      A = np.delete(input, [0,1], 1)
      
      print(A)
      

      它只是读取 csv 所有非浮点值都转换为 nan。然后只需使用 np.delete 删除前 2 列

      输出

      [[ 48.843226   2.31805 ]
       [ 48.844166   2.376   ]
       [ 48.844619   2.395897]
       [ 48.844666   2.3725  ]
       [ 48.844666   2.3725  ]
       [ 48.844925   2.389616]]
      

      【讨论】:

      • genfromtxt 采用usecols 参数;使用usecols=[2,3],您无需删除任何内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 2021-01-25
      • 2014-11-23
      • 1970-01-01
      • 2021-03-13
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多