簡體   English   中英

讀取csv文件Python時跳過第一列

[英]Skip the first column when reading a csv file Python

我正在嘗試讀取一個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”的列中跳過數據。

您可以使用字典閱讀器:

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

好的,因此可以使用正則表達式(實際上不是問題的范圍,但是……)刪除data (或關鍵字是哪個關鍵字)。

關於正則表達式:

假設您的關鍵字是data ,對嗎? 您可以使用以下命令:( (?:data)*\\W*(?P<juicy_data>\\w+)\\W*(?:data)*如果您使用的是其他關鍵字,則只需在該常規字符串中更改兩個data字符串keyword包含的任何其他值的表達式...

您可以在www.pythonregex.comwww.debuggex.com上在線測試正則表達式

正則表達式基本上是在說:尋找零個或多個data字符串,但是(如果找到的話)對它們不做任何事情。 不要將它們添加到匹配的組列表中,不要顯示它們……什么也不要,只要匹配它們,然后將其丟棄即可。 之后,尋找零個或多個非單詞字符(不是字母或數字的任何字符……以防萬一有data :或\\W后面的空格,或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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM