【问题标题】:Reading column names alone in a csv file在 csv 文件中单独读取列名
【发布时间】:2015-05-04 09:33:11
【问题描述】:

我有一个包含以下列的 csv 文件:

身份证、姓名、年龄、性别

后面是上面列的很多值。 我正在尝试单独读取列名并将它们放入列表中。

我正在使用 Dictreader,这给出了正确的详细信息:

with open('details.csv') as csvfile:
    i=["name","age","sex"]
    re=csv.DictReader(csvfile)
    for row in re:
        for x in i:
            print row[x]

但我想要做的是,我需要使用输入 csv 自动解析列列表(在上述情况下为“i”),而不是将它们硬编码到列表中。

with open('details.csv') as csvfile:
   
    rows=iter(csv.reader(csvfile)).next()
    header=rows[1:]
    re=csv.DictReader(csvfile)
    for row in re:
        print row
        for x in header:
            
            print row[x]

这会报错

Keyerrror:'name'

在行打印行[x]。我哪里错了?是否可以使用 Dictreader 获取列名?

【问题讨论】:

  • 我认为是print re[x]
  • 你会得到错误:Dictreader instance has no attribute "getitem"
  • 你能张贴几行你的文件看看它的样子吗?
  • id,name,age,sex 100101,Herbert,21,m 100102,Keith,18,m 100103,Jennifer,15,f

标签: python


【解决方案1】:

虽然您已经有了一个公认的答案,但我想我会为其他对不同解决方案感兴趣的人添加此答案-

一个实现可能如下:

import csv

with open('C:/mypath/to/csvfile.csv', 'r') as f:
    d_reader = csv.DictReader(f)

    #get fieldnames from DictReader object and store in list
    headers = d_reader.fieldnames

    for line in d_reader:
        #print value in MyCol1 for each row
        print(line['MyCol1'])

在上面,d_reader.fieldnames 返回标题列表(假设标题在顶行)。 这允许...

>>> print(headers)
['MyCol1', 'MyCol2', 'MyCol3']

如果您的标题在第 2 行(最上面的行是第 1 行),您可以执行以下操作:

import csv

with open('C:/mypath/to/csvfile.csv', 'r') as f:
    #you can eat the first line before creating DictReader.
    #if no "fieldnames" param is passed into
    #DictReader object upon creation, DictReader
    #will read the upper-most line as the headers
    f.readline()

    d_reader = csv.DictReader(f)
    headers = d_reader.fieldnames

    for line in d_reader:
        #print value in MyCol1 for each row
        print(line['MyCol1'])

【讨论】:

  • 这是一个巧妙的解决方案! :)
  • 当我“升级”到 python3 时,fieldnames 属性现在返回None。根据文档,它看起来应该仍然可以工作,但事实并非如此。物有所值。我正在使用python 3.7。我认为在 python3.6 中 DictReader 返回的内容发生了变化。
  • 有趣 - 值得一提的是,Python 3.7 中的 hello world CSV 阅读器为我提供了正确的fieldnames
  • DictReader.fieldnames 解决方案非常有效。根据我的时间安排,比这篇文章中提到的其他方法更有效。谢谢!
【解决方案2】:

您可以使用next() 函数读取标题,该函数将读取器的可迭代对象的下一行作为列表返回。然后您可以将文件的内容添加到列表中。

import csv
with open("C:/path/to/.filecsv", "rb") as f:
    reader = csv.reader(f)
    i = reader.next()
    rest = list(reader)

现在我将列的名称作为一个列表。

print i
>>>['id', 'name', 'age', 'sex']

另请注意,reader.next() 在 python 3 中不起作用。而是使用内置的next() 在读取后立即获取 csv 的第一行,如下所示:

import csv
with open("C:/path/to/.filecsv", "rb") as f:
    reader = csv.reader(f)
    i = next(reader)

    print(i)
    >>>['id', 'name', 'age', 'sex']

【讨论】:

  • 感谢您的解决方案。但我只想通过列名来访问它们。假设我只需要最后 3 列......在这种情况下,我必须使用索引 i 来处理它们......例如 i[0] 等等......是否可以使用 dictreader 来做到这一点?然后我可以访问 row[name] 。我只需要我的代码来支持多列。除了索引之外,我还关心列名。
  • 那种。那么例如如果你访问names,你想检索文件中的所有名字?
  • 请参阅下面的更新答案。你让我今天一整天都感觉很好。谢谢:)
  • 酷,抱歉,我没有清楚地了解您需要什么。很高兴我能帮上忙
  • 是的,我想通了。感谢您的解决方案。您的迭代器像 CHARM 一样工作。
【解决方案3】:

csv.DictReader 对象公开了一个名为fieldnames 的属性,这就是您要使用的属性。这是示例代码,后面是输入和相应的输出:

import csv
file = "/path/to/file.csv"
with open(file, mode='r', encoding='utf-8') as f:
    reader = csv.DictReader(f, delimiter=',')
    for row in reader:
        print([col + '=' + row[col] for col in reader.fieldnames])

输入文件内容:

col0,col1,col2,col3,col4,col5,col6,col7,col8,col9
00,01,02,03,04,05,06,07,08,09
10,11,12,13,14,15,16,17,18,19
20,21,22,23,24,25,26,27,28,29
30,31,32,33,34,35,36,37,38,39
40,41,42,43,44,45,46,47,48,49
50,51,52,53,54,55,56,57,58,59
60,61,62,63,64,65,66,67,68,69
70,71,72,73,74,75,76,77,78,79
80,81,82,83,84,85,86,87,88,89
90,91,92,93,94,95,96,97,98,99

打印语句的输出:

['col0=00', 'col1=01', 'col2=02', 'col3=03', 'col4=04', 'col5=05', 'col6=06', 'col7=07', 'col8=08', 'col9=09']
['col0=10', 'col1=11', 'col2=12', 'col3=13', 'col4=14', 'col5=15', 'col6=16', 'col7=17', 'col8=18', 'col9=19']
['col0=20', 'col1=21', 'col2=22', 'col3=23', 'col4=24', 'col5=25', 'col6=26', 'col7=27', 'col8=28', 'col9=29']
['col0=30', 'col1=31', 'col2=32', 'col3=33', 'col4=34', 'col5=35', 'col6=36', 'col7=37', 'col8=38', 'col9=39']
['col0=40', 'col1=41', 'col2=42', 'col3=43', 'col4=44', 'col5=45', 'col6=46', 'col7=47', 'col8=48', 'col9=49']
['col0=50', 'col1=51', 'col2=52', 'col3=53', 'col4=54', 'col5=55', 'col6=56', 'col7=57', 'col8=58', 'col9=59']
['col0=60', 'col1=61', 'col2=62', 'col3=63', 'col4=64', 'col5=65', 'col6=66', 'col7=67', 'col8=68', 'col9=69']
['col0=70', 'col1=71', 'col2=72', 'col3=73', 'col4=74', 'col5=75', 'col6=76', 'col7=77', 'col8=78', 'col9=79']
['col0=80', 'col1=81', 'col2=82', 'col3=83', 'col4=84', 'col5=85', 'col6=86', 'col7=87', 'col8=88', 'col9=89']
['col0=90', 'col1=91', 'col2=92', 'col3=93', 'col4=94', 'col5=95', 'col6=96', 'col7=97', 'col8=98', 'col9=99']

【讨论】:

    【解决方案4】:

    怎么样

    with open(csv_input_path + file, 'r') as ft:
        header = ft.readline() # read only first line; returns string
        header_list = header.split(',') # returns list
    

    我假设您的输入文件是 CSV 格式。 如果使用 pandas,如果文件很大,则需要更多时间,因为它将整个数据作为数据集加载。

    【讨论】:

      【解决方案5】:

      感谢 Daniel Jimenez 提供了从我的 csv 中单独获取列名的完美解决方案,我将他的解决方案扩展为使用 DictReader,以便我们可以使用列名作为索引来迭代行。谢谢希门尼斯。

      with open('myfile.csv') as csvfile:
      
          rest = []
          with open("myfile.csv", "rb") as f:
              reader = csv.reader(f)
              i = reader.next()
              i=i[1:]
              re=csv.DictReader(csvfile)
              for row in re:
                  for x in i:
                      print row[x]
      

      【讨论】:

        【解决方案6】:

        我只是提到如何从 csv 文件中获取所有列名。 我正在使用熊猫库。

        首先我们读取文件。

        import pandas as pd
        file = pd.read_csv('details.csv')
        

        然后,为了从输入文件中获取所有列名作为列表,请使用:-

        columns = list(file.head(0))
        

        【讨论】:

          【解决方案7】:

          这是仅打印 csv 文件的标题或列的代码。

          import csv
          HEADERS = next(csv.reader(open('filepath.csv')))
          print (HEADERS)
          

          熊猫的另一种方法

          import pandas as pd
          HEADERS = list(pd.read_csv('filepath.csv').head(0))
          print (HEADERS)
          

          【讨论】:

            【解决方案8】:
            import pandas as pd
            data = pd.read_csv("data.csv")
            cols = data.columns
            

            【讨论】:

            • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
            【解决方案9】:

            我实际上只是想要我的数据的第一行,这是我需要的标题,并且不想遍历我的所有数据来获取它们,所以我只是这样做了:

            with open(data, 'r', newline='') as csvfile:
            t = 0
            for i in csv.reader(csvfile, delimiter=',', quotechar='|'):
                if t > 0:
                    break
                else:
                    dbh = i
                    t += 1
            

            【讨论】:

              【解决方案10】:

              使用 pandas 也是一种选择。

              但不是将整个文件加载到内存中,您可以只检索它的第一个块以使用迭代器获取字段名称。

              import pandas as pd
              
              file = pd.read_csv('details.csv'), iterator=True)
              column_names_full=file.get_chunk(1)
              column_names=[column for column in column_names_full]
              print column_names
              

              【讨论】:

                猜你喜欢
                • 2017-05-17
                • 1970-01-01
                • 2016-11-22
                • 1970-01-01
                • 1970-01-01
                • 2014-06-12
                • 1970-01-01
                • 1970-01-01
                • 2015-10-17
                相关资源
                最近更新 更多