处理Python中的正则表达式匹配CSV记录

处理Python中的正则表达式匹配CSV记录

问题描述:

我试过了(4小时阅读文档,谷歌搜索,...),它必须是我的大脑,所以我会感谢任何温柔的微调或正确的方向踢:处理Python中的正则表达式匹配CSV记录

得到一个.csv文件,我需要处理: 仅保持一定的正则表达式匹配的行(RE是^[A-Z][A-Z];.*15%;),然后打印出特定列(例如1,2,13,15和17)。在shell(grep,awk)中很容易,在Python中不可能(对我来说)。

这是我想出了迄今为止代码:

import re 
import csv 
src="/Users/username/file.csv" 
reg="^[A-Z][A-Z];.*15%;" 
with open(src, "r") as file: 
    for line in file: 
     line=line.strip() 
     match = re.match(reg,line.strip()) 
     if match: 
      vat=csv.reader(line, delimiter=';') 
      for r in vat: 
       print r[0] 

出乎我的信念,CSV模块解析每个字符的记录,而不是整个行,因此输出不是现场[0]的一个数组,但是有一个字符。

如果我添加打印行,如果匹配

if match: 
    print line 

行打印正确后,因此我的困惑 - 为什么不csv.reader这样对待他们?

期待着听到您的想法 - 知道蟒蛇,该解决方案是非常简单;-)

PS:如果RE匹配可以在单独的列进行加分,我。即只处理行,如果1列的匹配[AZ] [AZ]忽略大小写和柱17个匹配15% - 然后打印第1列,2,13,15和17

+0

'csv.reader'迭代你给它的对象,然后将它分割成一个字符串列表。你用一行代替一个文件提供csv.reader。当你遍历一行(这是一个字符串)时,你得到的字符为_records_,当你遍历一个文件时,你会得到行。 –

with open(src, newline='') as file: 
    r = csv.reader(file, delimiter=';') 
    for line in r: 
     if len(line[0]) ==2 and line[0].isalpha() and line[16]=='15%': 
      print(line) #Or whatever it is you want to do 

没有正则表达式确实必要的,但r'[a-zA-Z]{2}'也可以工作

+0

应该是:'line [16] =='15%''(语法错误)。无法直接编辑这篇文章,因为“编辑必须至少有6个字符”;) –

+0

@dr_agon好赶上 –

+0

谢谢帕特里克!这样做的诀窍:-)比我更优雅(这并不是那么困难);-) –