读取csv文件Python时跳过第一列

时间:2014-12-02 22:20:34

标签: python csv skip

我正在尝试读取csv文件并从中提取所需数据。我的代码如下所示。

import csv
file = "sample.csv"
def get_values_flexibly(file, keyword):
    def process(func):
        return set([func(cell)] + [func(row[index]) for row in reader])

    with open(file, 'r') as f:
        reader = csv.reader(f)
        first_row = reader.next()
        if keyword in first_row:
            return str(list(set([row[first_row.index(keyword)] for row in reader])))
        for index, cell in enumerate(reader.next()):
            if cell.endswith(' ' + keyword):
                return str(list(set(process(lambda cell: cell[:-len(keyword) - 1]))))
            elif cell.split(':')[0].strip() == keyword:
                return str(list(set(process(lambda cell: cell.split(':')[1].strip()))))
print get_values_flexibly(file, 'data')

其中sample.csv类似于下面的内容

sample.csv

h1,h2,h3
a data,data: abc,tr
b data,vf data, gh
k data,grt data, ph

我想从输出中排除第一列。我目前的输出是['a','k','b'],但我希望它是['abc', 'vf', 'grt']。如何使用csv阅读器实现这一目标?

编辑 - 我有多个文件。每个文件可以有不同的标题,列数也会有所不同。我想要一个适用于所有文件的脚本。此外,第一列的标题始终相同,例如“sample_column”。我想从标题为“sample_column”的列中跳过数据。

2 个答案:

答案 0 :(得分:1)

您可以使用dict阅读器:

data = {'h1':[], 'h2':[], 'h3':[]}

h = ['h1', 'h2', 'h3']
csvfile = open(dir)
reader = DictReader(csvfile)
for line in reader:
    data['h1'].append(line[h[0]][2:])
    data['h2'].append(line[h[1]][2:])  # Use indexing to get the bits you want
    data['h3'].append(line[h[2]])

答案 1 :(得分:0)

好的,所以删除data(或任何一个关键字)可以用正则表达式完成(这不是问题的范围,但是......)

关于正则表达式:

我们假设您的关键字是data,对吗?您可以使用此(?:data)*\W*(?P<juicy_data>\w+)\W*(?:data)*如果您的关键字是其他关键字,则只需将该正则表达式中的两个data字符串更改为keyword包含的任何其他值...

您可以在www.pythonregex.comwww.debuggex.com

在线测试正则表达式

正则表达式基本上是这样说:查找零个或多个data字符串,但(如果找到的话)不对它们做任何事情。不要将它们添加到匹配组列表中,不要显示它们......没有,只是匹配它们但丢弃它们。之后,查找零个或多个非单词字符(任何不是字母或数字的字符......以防万一有data:或后面的空格,或data--> .. 。\W删除data之后的所有非字母数字字符然后你到达juicy_data那是一个或多个可以在“常规”单词中找到的字符(任何字符)字母数字字符)。然后,如果后面有data,请执行与第一个data组相同的操作。只需匹配并删除即可。

现在,要删除第一列:您可以使用csv.reader本身就是迭代器的事实。当你迭代它时(如下面的代码那样),它会给你一个包含一行中找到的所有列的列表。它为您提供list所有行的事实对您的情况非常有用:您只需收集所述row的第一项,因为这是您关注的列(您不喜欢)我需要row[0],也不需要row[1:]

所以这就是:

import csv
import re

def get_values_flexibly(csv_path, keyword):
    def process(func):
        return set([func(cell)] + [func(row[index]) for row in reader])
    # Start fo real!
    kwd_remover = re.compile(
        r'(?:{kw})*\W*(?P<juicy_data>\w+)\W*(?:{kw})*'.format(kw=keyword)
    )
    result = []
    with open(csv_path, 'r') as f:
        reader = csv.reader(f)
        first_row = [kwd_remover.findall(cell)[0] for cell in reader.next()]
        print "Cleaned first_row: %s" % first_row
        for index, row in enumerate(reader):
            print "Before cleaning: %s" % row
            cleaned_row = [kwd_remover.findall(cell)[0] for cell in row]
            result.append(cleaned_row[1])
            print "After cleaning: %s" % cleaned_row
    return result

print "Result: %s" %  get_values_flexibly("sample.csv", 'data')

输出:

Cleaned first_row: ['h1', 'h2', 'h3']
Before cleaning: ['a data', 'data: abc', 'tr']
After cleaning: ['a', 'abc', 'tr']
Before cleaning: ['b data', 'vf data', ' gh']
After cleaning: ['b', 'vf', 'gh']
Before cleaning: ['k data', 'grt data', ' ph']
After cleaning: ['k', 'grt', 'ph']
Result: ['abc', 'vf', 'grt']