使用python将CSV文件列直接读入变量名称

时间:2011-06-14 23:02:22

标签: python csv

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

到目前为止,答案似乎与csv.DictReader有关,但我无法使其正常工作。我没有标题行,因此必须手动创建列名。 (我想用字典mydictionary = {'ColumnName1':0,'ColumnName2':1,'ColumnName3':3})

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

6 个答案:

答案 0 :(得分:7)

使用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])

答案 1 :(得分:3)

for row in thingthatyieldslists:
  col1, col2, col3 = row
  print "%s: %s, %s" % (col1, col2, col3)

答案 2 :(得分: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')}

答案 3 :(得分:1)

我认识到这篇文章差不多有两年了,但我想开始积极地为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

答案 4 :(得分:0)

这是无头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)

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

答案 5 :(得分:0)

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

import sys

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

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

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