【问题标题】:reading a CSV files columns directly into variables names with python使用 python 将 CSV 文件列直接读取到变量名称中
【发布时间】:2011-06-14 23:02:21
【问题描述】:

我想将 CSV 文件的列直接读入变量。结果应该类似于使用以下 shell 行得到的结果: 当 IFS= 时,读取 ColumnName1 ColumnName2 ColumnName3 做事

到目前为止,答案似乎是 csv.DictReader,但我无法让它工作。我没有标题行,因此必须手动创建列名。 (我认为字典的形式为 mydictionary={ 'ColumnName1':0, 'ColumnName2':1, 'ColumnName3':3 } )

此外,列可以作为简单的变量名引用还是必须使用 list[index] 样式引用。仅按名称打印列的代码示例会很好。感谢您的帮助。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    这是你要找的东西吗(Python 3.X):

    import csv
    from io import StringIO
    
    # Simulate a csv data file with no header
    data = StringIO('''\
    Mark,44,1
    Joe,22,0
    Craig,39,3
    ''')
    
    for row in csv.DictReader(data,'Name Age Children'.split()):
        print(row)
    

    输出

    {'Age': '44', 'Name': 'Mark', 'Children': '1'}
    {'Age': '22', 'Name': 'Joe', 'Children': '0'}
    {'Age': '39', 'Name': 'Craig', 'Children': '3'}
    

    或许:

    import csv
    from io import StringIO
    
    # Simulate a csv data file with no header
    data = StringIO('''\
    Mark,44,1
    Joe,22,0
    Craig,39,3
    ''')
    
    # 1. Read in all the data
    # 2. Transpose into columns
    # 3. Match with column names
    # 4. Create dictionary
    cols = dict(zip('Name Age Children'.split(),zip(*csv.reader(data))))
    print(cols)
    

    输出

    {'Age': ('44', '22', '39'), 'Name': ('Mark', 'Joe', 'Craig'), 'Children': ('1', '0', '3')}
    

    【讨论】:

      【解决方案2】:

      感谢大家处理我的问题。这就是我最终要做的。很简单,但它奏效了。同样,问题是将无头 CSV 读入变量,以便我可以“做事”

      import sys
      
      for record in sys.stdin.readlines():
          record = record.rstrip()
          ColumnName1, ColumnName2, ColumnName2 = record.split(',')
      

      这与我在问题中发布的 shell 代码的作用相同: while IFS=, read ColumnName1 ColumnName2 ColumnName3做事

      感谢所有帮助。我很快就会问更多问题!

      【讨论】:

        【解决方案3】:

        内置的CSV 模块在处理 csv 文件时非常有用。


        哦,没关系,如果您正在查看 DictReader,您一定已经在使用它了。

        我处理没有标题的文件的通常方法是读取第一行,解析它的逗号数(以及列数),然后设置我的字典/列表以包含来自csv 文件(使用列数并在我的代码中为每列命名。)如有必要,我可以提供一个示例,这非常简单。


        我想我更能理解你的问题,这是不是你想要的更多?:

        mydictionary={ 'ColumnName1':[dataRow1Col1, dataRow2Col1, dataRow3Col1], 
                       'ColumnName2':[dataRow1Col2, dataRow2Col2, dataRow3Col2], 
                       'ColumnName3':[dataRow1Col3, dataRow2Col3, dataRow3Col3] }
        

        在这种情况下,这样的事情可能会起作用:

        import csv
        Col1 = "ColumnName1"
        Col2 = "ColumnName2"
        Col3 = "ColumnName3"
        mydictionary={Col1:[], Col2:[], Col3:[]}
        csvFile = csv.reader(open("myfile.csv", "rb"))
        for row in csvFile:
          mydictionary[Col1].append(row[0])
          mydictionary[Col2].append(row[1])
          mydictionary[Col3].append(row[2])
        

        【讨论】:

        • 你为什么要计算列数,只是为了设置变量?如果该文件没有足够的列供您的代码使用,那么再多的设置字典或列表都无法放入其中。
        • 我的描述是笼统的,并不打算包括某些极端情况或必须进行的所有参数检查。我想要的是对方法的清晰和理解,而不是确切的实施。
        【解决方案4】:

        我知道这篇文章已经发布了将近两年,但我想开始为 stackoverflow 做出积极贡献。

        我假设您希望这比三列更通用,但效率并不重要。

        import csv
        f = csv.reader(open('my file.csv','r'))
        e = f.next() #Give us a sample of our data
        ecount = len(e)
        for i in range(ecount): #use range here to keep variable order in CSV preserved in naming
            vars()['ColumnName'+str(i+1)]] = list(e[i]) # makes a list for each item 
        for j in f:
            for l in range(ecount): 
                vars()['ColumnName'+str(l+1)].append(j[l]) #Reads in variable values to list
        

        【讨论】:

          【解决方案5】:
          for row in thingthatyieldslists:
            col1, col2, col3 = row
            print "%s: %s, %s" % (col1, col2, col3)
          

          【讨论】:

          • 它没有。您说您希望“将 CSV 文件的列直接转换为变量”。这就是我所做的。
          • 您能否提供更多详细信息。我收到值错误:解包的值太多。我读过的所有内容似乎都在使用 CSV 模块来读取 csv 文件,尤其是 dictreader。你熟悉这个吗?
          • DictReader 如您所说,如果文件没有标题,则毫无意义。我给出的代码是用于 3 列的文件;根据情况使用更少或更多的变量。
          【解决方案6】:

          这是一个用于无头 csv 的“dictreader”,每一行将是一个字典,其中包含顺序键 'column_0'、'column_1'、'column_2' 等等...

          import csv
          
          csvfile = list(csv.reader(open('data.csv')))
          
          csvdics = []
          
          for row in csvfile:
              row_dict = {}
              for i in xrange(len(row)):
                  row_dict['column_%s' % i] = row[i]
              csvdics.append(row_dict)
          

          或者,如果您提前知道列名应该是什么,您可以将它们作为第二个参数传递给一个列表。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-05-17
            • 1970-01-01
            • 2023-03-16
            • 2023-03-15
            • 2021-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多