【问题标题】:Python3 reading data from cvs file: Converting columns to Lists [duplicate]Python3从csv文件读取数据:将列转换为列表[重复]
【发布时间】:2016-01-02 22:54:12
【问题描述】:

我正在使用 Python 读取 cvs 文件。 CSV 文件有两列以“,”分隔。我只能阅读一列,当我尝试为下一列创建列表时,我得到一个空白列表。

我的代码如下:

import csv
with open('exdata1.csv') as inputData:
    data = csv.reader(inputData, delimiter=',')
    xVal = [row[0] for row in data]
    yVal = [row[1] for row in data]

输出是这样的:

>>> xVal
['6.1101', '5.5277', '8.5186', '7.0032', '5.8598', '8.3829', '7.4764', '8.5781', '6.4862', '5.0546', '5.7107', '14.164', '5.734', '8.4084', '5.6407', '5.3794', '6.3654', '5.1301', '6.4296', '7.0708', '6.1891', '20.27', '5.4901', '6.3261', '5.5649', '18.945', '12.828', '10.957', '13.176', '22.203', '5.2524', '6.5894', '9.2482', '5.8918', '8.2111', '7.9334', '8.0959', '5.6063', '12.836', '6.3534', '5.4069', '6.8825', '11.708', '5.7737', '7.8247', '7.0931', '5.0702', '5.8014', '11.7', '5.5416', '7.5402', '5.3077', '7.4239', '7.6031', '6.3328', '6.3589', '6.2742', '5.6397', '9.3102', '9.4536', '8.8254', '5.1793', '21.279', '14.908', '18.959', '7.2182', '8.2951', '10.236', '5.4994', '20.341', '10.136', '7.3345', '6.0062', '7.2259', '5.0269', '6.5479', '7.5386', '5.0365', '10.274', '5.1077', '5.7292', '5.1884', '6.3557', '9.7687', '6.5159', '8.5172', '9.1802', '6.002', '5.5204', '5.0594', '5.7077', '7.6366', '5.8707', '5.3054', '8.2934', '13.394', '5.4369']
>>> yVal
[]

我不确定谷歌到底应该针对这个问题做什么。有什么教程可以解决这个问题吗?

【问题讨论】:

  • 能否附上部分或exdata1.csv 文件?
  • 第二列应该包含什么?

标签: python csv


【解决方案1】:

csv.reader() 对象从底层文件对象读取数据,并且文件对象的文件位置在您读取时会从头到尾移动。如果您想再次阅读,则需要将文件指针倒回到开头:

xVal = [row[0] for row in data]
inputData.seek(0)
yVal = [row[1] for row in data]

不过,您最好只阅读一次,然后transposing the rows to columns

xVal, yVal = zip(*data)[:2]

【讨论】:

  • 你能解释一下xVal, yVal = zip(*data)[:2]吗?
  • @Morpheus:我刚刚编辑了一个链接,指向解释这一点的帖子。基本上,您将所有行作为单独的参数应用到 zip() 函数,然后将每行的第一个值配对为一个列表,将每行的第二个值配对为另一个,等等。
  • @Morpheus:然后将生成的列列表切片为仅取前两列(如果您有超过 2 列)并将这两列分配给变量 xValyVal .
  • 非常感谢!刚看到链接。
  • @Morpheus:是的,Python 3 中的zip() 返回一个生成器。使用xVal = next(columns); yVal = next(columns),或使用columns = list(zip(*data)),或使用itertools.islice() 对象进行切片。
【解决方案2】:

我建议使用 Pandas 并将 CSV 作为数据框读取,然后您可以将列作为 Numpy 数组快速访问。代码示例

import pandas as pd
import numpy as np

df = pd.read_csv('exdata1.csv', header=None, names=['One', 'Two'])
print(df)

print(df.One)
print(df.Two)

【讨论】:

  • 谢谢。我正在寻找一种不依赖于颠簸或熊猫的解决方案。
【解决方案3】:

您可以将代码data = csv.reader(inputData, delimiter=',') 中的这一行更改为data = list(csv.reader(inputData, delimiter=','))

这将创建列表,您可以根据需要重复使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 2021-07-27
    • 2015-07-29
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多