【问题标题】:Python read csv file columns into lists, ignoring headersPython 将 csv 文件列读入列表,忽略标题
【发布时间】:2018-03-25 17:52:52
【问题描述】:

我有一个类似“data.csv”的文件

ColA, ColB, ColC
1,2,3
4,5,6
7,8,9

我想打开文件列并将其读入列表中,省略该列表的第一个条目,例如

dataA = [1,4,7]
dataB = [2,5,8]
dataC = [3,6,9]

实际上有超过 3 列并且列表很长,这只是格式的一个示例。我试过了:

csv_file = open('data.csv','rb')
csv_array = []

for row in csv.reader(csv_file, delimiter=','):
    csv_array.append(row)

然后我会将csv_array 的每个索引分配给一个列表,例如

dataA = [int(i) for i in csv_array[0]]

但我遇到了错误:

_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

另外,将数据保存到几个列表中感觉就像是一种非常冗长的方式......

谢谢!

编辑:

我是这样解决的:

import pandas as pd

df = pd.read_csv('data.csv', names = ['ColA','ColB','ColC']

dataA = map(int,(df.ColA.tolist())[1:3])

然后重复其余列。

【问题讨论】:

标签: python list csv


【解决方案1】:

使用csv.DictReader() 选择特定列

dataA = []
dataB = []
with open('data.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file, delimiter=',')    
    for row in csv_reader:
        dataA.append(row['ColA'])
        dataB.append(row['ColB'])

【讨论】:

    【解决方案2】:

    只是为了让那些试图解决类似问题的人明白这一点,也许没有 Pandas,这里有一个使用 cmets 的简单重构。

    import csv
    
    # Open the file in 'r' mode, not 'rb'
    csv_file = open('data.csv','r')
    dataA = []
    dataB = []
    dataC = []
    
    # Read off and discard first line, to skip headers
    csv_file.readline()
    
    # Split columns while reading
    for a, b, c in csv.reader(csv_file, delimiter=','):
        # Append each variable to a separate list
        dataA.append(a)
        dataB.append(b)
        dataC.append(c)
    

    这对将单个字段转换为数字没有任何作用(如果需要,请使用 append(int(a)) 等),但希望足够明确和灵活,以向您展示如何适应新的要求。

    【讨论】:

      【解决方案3】:

      首先如果你用 csv.reader(csv_file, delimiter=',') 读取 csv 文件,你仍然会读取文件头。

      csv_array[0] 将是标题行 -> ['ColA', 'ColB', 'ColC']

      另外,如果你使用的是 mac,这里已经提到了这个问题:CSV new-line character seen in unquoted field error

      如果您要使用数据进行更多分析,我建议您使用 pandas&numpy。它将 csv 文件读取到 pandas 数据帧。 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

      【讨论】:

        【解决方案4】:

        您的 csv 文件中似乎有 OSX 行结尾。尝试将 csv 文件保存为“Windows 逗号分隔 (.csv)”格式。

        还有更简单的方法可以使用 csv 阅读器完成您正在做的事情:

        csv_array = []
        with open('data.csv', 'r') as csv_file:
            reader = csv.reader(csv_file)
            # remove headers
            reader.next() 
            # loop over rows in the file, append them to your array. each row is already formatted as a list.
            for row in reader:
                csv_array.append(row)
        

        然后你可以设置dataA = csv_array[0]

        【讨论】:

        • 文件是从 excel 导出的,据我所知,它只是一个普通的 .csv 文件...
        • 好的,这几乎可以工作,但我得到的是行而不是列,即dataA = [1,2,3],我想要dataA=[1,4,7]
        • 很抱歉错过了这部分问题。您可以使用zip 转置它:csv_array = zip(csv_array[0], csv_array[1], csv_array[2]。可能有更简单的方法,但我认为这是最冗长且最容易获得的方法。
        【解决方案5】:

        使用熊猫:

        import pandas as pd
        
        df = pd.DataFrame.from_csv(path)
        rows = df.apply(lambda x: x.tolist(), axis=1)
        

        【讨论】:

        • 当 csv 以 batteries included 出现时,为什么要使用 pandas?
        • 自 0.21.0 版起已弃用:改用 pandas.read_csv()。 source 例如:pd.read_csv(path)
        【解决方案6】:

        要跳过标题,请在单独的行上创建您的阅读器。然后要将行列表转换为列列表,请使用zip()

        import csv
        
        with open('data.csv', 'rb') as f_input:
            csv_input = csv.reader(f_input)
            header = next(csv_input)
            data = zip(*[map(int, row) for row in csv_input])
        
        print data
        

        给你:

        [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
        

        所以如果需要的话:

        dataA = data[0]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-01
          • 2018-05-07
          • 2011-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多