Python:读取和写入CSV文件

时间:2012-07-25 22:28:42

标签: python csv

我正在尝试从CSV文件(A)中读取数据,提取数据并将其写入不同的CSV文件(B)。在新文件B中,我想要有两列。第1列列出文件A和第2列中第1列的名称,以列出文件A中第1列的计数。例如,如果文件A看起来像没有':'(它们排成两列):

Animal: Gender
Rabbit: Male
Dog: Male
Rabbit: Female
Cat: Male
Cat: Male
Dog: Female
Dog: Male
Turtle: Male

我希望文件B中的输出看起来像这样(实际上在不同的列中没有':'):

Animal: Count
Cat: 2
Dog: 3
Rabbit: 2
Turtle: 1

这是我第一次做这样的事情,这是我到目前为止所做的,但是我没有将数据打印在文件B中并且正确地完成了“计数”。有人可以帮帮我吗?

import csv
ReadData=csv.reader(open('C:\Users\..\FileA.csv','rb'), delimiter=',')

def column(ReadData, i):
    return [row[i] for row in ReadData]

for line in ReadData:
   WriteData=csv.writer(open('C:\Users\..\FileB.csv','wb'),
                        delimiter=' ', quotechar=':', quoting=csv.QUOTE_ALL)
   print column(ReadData,1)

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

要在Python> = 2.7中进行计数,请参阅this example for collections.Counter。使用collections.defaultdict,请参阅here

在致电csv.writer时,quotechar=':'可能是一个错误(这会使WriteData.writerow(['Hello World', 12345])发出“:Hello World:12345”,好像冒号是引号

另请注意,您的函数column(ReadData, i)会消耗ReadData;后续调用ReadData可能会返回一个空列表(未测试)。这对您的代码来说不是问题(至少现在不是)。

这是一个没有CSV模块的解决方案(毕竟,这些文件看起来不像CSV):

import collections

inputfile = file("A")

counts = collections.Counter()

for line in inputfile:
    animal = line.split(':')[0]
    counts[animal] += 1

for animal, count in counts.iteritems():
    print '%s: %s' % (animal, count)

答案 1 :(得分:1)

我会回答您问题的计数部分,也许您可​​以将其与问题的csv部分结合起来。

l = [
    ('Animal','Gender'),
    ('Rabbit','Male'),
    ('Dog','Male'),
    ('Rabbit','Female'),
    ('Cat','Male'),
    ('Cat','Male'),
    ('Dog','Female'),
    ('Dog','Male'),
    ('Turtle','Male')
    ]

d = {}
for k,v in l:
    if not k in d:
        d[k] = 1
    else:
        d[k] += 1

for k in d:
    print "%s: %d" % (k,d[k])

我没有过滤你的标题行,这段代码的输出是:

Turtle: 1
Cat: 2
Rabbit: 2
Animal: 1
Dog: 3

修改

你可以替换它:

if not k in d:
    d[k] = 1
else:
    d[k] += 1

有了这个:

d[k] = d.setdefault(k,0) + 1

答案 2 :(得分:0)

查看itertools模块和groupby功能。例如:

from itertools import groupby

animals = [
    ('Rabbit', 'Male'),
    ('Dog', 'Male'),
    ('Rabbit', 'Female'),
    ('Cat', 'Male'),
    ('Cat', 'Male'),
    ('Dog', 'Female'),
    ('Dog', 'Male'),
    ('Turtle', 'Male')
    ]

def get_group_key(animal_data):
    return animal_data[0]

animals = sorted(animals, key=get_group_key)
animal_groups = groupby(animals, get_group_key)

grouped_animals = []
for animal_type in animal_groups:
    grouped_animals.append((animal_type[0], len(list(animal_type[1]))))

print grouped_animals

>>> [('Cat', 2), ('Dog', 3), ('Rabbit', 2), ('Turtle', 1)]

答案 3 :(得分:0)

根据数据的大小和复杂程度......您可能需要考虑在http://pandas.pydata.org/使用pandas - info并在PyPi上使用。

但是请注意,这可能是过度杀戮,但我认为我会把它扔进混合物中。

from pandas import DataFrame

# rows is processed from string in the OP
rows = [['Rabbit', ' Male'], ['Dog', ' Male'], ['Rabbit', ' Female'], ['Cat', ' Male'], ['Cat', ' Male'], ['Dog', ' Female'], ['Dog', ' Male'], ['Turtle', ' Male']]

df = pandas.DataFrame(rows, columns=['animal', 'gender'])

>>> df.groupby('animal').agg(len)
        gender
animal        
Cat          2
Dog          3
Rabbit       2
Turtle       1

>>> df.groupby(['animal', 'gender']).agg(len)
animal  gender 
Cat      Male      2
Dog      Female    1
         Male      2
Rabbit   Female    1
         Male      1
Turtle   Male      1