【问题标题】:Python: How to compare two csv files and add classifier in first file if value exists in second filePython:如果第二个文件中存在值,如何比较两个 csv 文件并在第一个文件中添加分类器
【发布时间】:2016-12-19 13:50:12
【问题描述】:

我尝试比较两个 csv 文件。第一个文件 (movements.csv) 有 14 列,第二个 csv (LCC.csv) 有一个单列。我想检查movements.csv中第8列的条目(字符串)是否出现在LCC.csv的第1列中。如果是,则在第 14 栏中填写“是”,如果不是“否”。到目前为止我尝试的代码是和我收到的错误消息:


import csv

f1 = file('LCC.csv', 'rb') 
f2 = file('movements.csv', 'rb')
f3 = ('output.csv', 'wb') 

c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)

movements = list(c2)

for LCC_row in c1:
    row = 0
    found = False
    for movements_row in movements:
        output_row = movements_row
        if movements_row[7] == LCC_row[0]
            output_row.append('Yes')
            found = True
            break
        row += 1
    if not found:
        output_row.append('No')
    c3.writerow(output_row)

f1.close()
f2.close()
f3.close()

enter image description here

我是 python 的初学者,所以任何建议都非常感谢!最佳情况下,两列之间的检查也将忽略字符串是否以大写字母书写。

错误信息出现在

之后
c3.writerow(output_row)

作为

Traceback(最近一次调用最后一次):

  File "<stdin>", line 1, in <module>
_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
>>> 

LCC.csv(无标题):

Air Ab  
Jamb  
Sw  
AIRF  
EURO   

movements.csv(有标题):

ap,ic,year,y_m,pas,da,ty,airl,ic_a,dest_orig,ic_d,coun,cont,LCC  
Zue,LSZH,2005,200501,25,1/1/2005,Dep,"EURO",EUJ,"Mans C",EG,Gb,Eu,   
Zue,LSZH,2005,200501,204,1/1/2005,Arr,"Sw",SWR,"Dar",HA,Tans,A,   
Ba,LSZM,2005,200501,191,1/1/2005,Arr,"AIRF",AFR,"PG",LG,Fr,Eu,   
Zue,LSZH,2005,200501,228,1/1/2005,Dep,"THA",THA,Bang,VD,Th,As,   

如前所述,最后一列 (LCC) 目前完全为空

【问题讨论】:

  • “不工作”是什么意思?
  • 在 if Movements_row[7] == LCC_row[0] 后收到一条错误消息,即:文件“”,第 6 行 if Movements_row[7] == LCC_row[0] ^ SyntaxError : 无效语法
  • 请使用错误消息编辑您的问题。并清楚地标出是哪条线引起的。
  • @AnnaStünzi:用pandas解决这个问题可以吗??
  • 你在 if 语句后错过了一个 ' : '

标签: python csv


【解决方案1】:

它有很多问题。浏览代码后我发现的几个是:

  1. 您的行中有无效的报价 '

    f2 = file('movements.csv', ,rb')
    #                          ^
    

    应该是:

    f2 = file('movements.csv', 'rb')
    
  2. 在您分享的代码中,您在不同的地方都有`反引号,而不是单引号'。例如,您的行应该是:

    f1 = file('LCC.csv', 'rb') 
    f3 = file('output.csv', 'wb')    
    #     ^ also missing file here
    
  3. if 后缺少冒号 :。应该是:

    if movements_row[7] == LCC_row[0]:
    #                           Here ^
    

另外,为了初始化字符串,你不需要括号。只需像这样分配它:

output_row[13] = 'Yes'
#                ^ As simple string

【讨论】:

  • `被称为反引号或反引号。
  • 是的,抱歉,这是论坛中的复制粘贴错误,在我使用的代码中,我到处都有',我刚刚再次检查了
  • 还有一些错误
  • @iFlo:是的,这就是我发现的。每次我看到代码,我发现很少。而且我没有检查逻辑错误
  • @MoinuddinQuadri SyntaxError 几乎总是意味着缺少或不正确的标点符号。当我忘记冒号和右括号时,我通常会得到这个。要追查问题,请从错误消息中指示的行开始并向后工作。
【解决方案2】:

您的代码中有很多错误。他们已经在这里指出:https://stackoverflow.com/a/41224147/3027854

moments.csv 的一个问题

ap,ic,year,y_m,pas,da,ty,airl,ic_a,dest_orig,ic_d,coun,cont,LCC 
Zue,LSZH,2005,200501,25,1/1/2005,Dep,"EURO",EUJ,"Mans C",EG,Gb,Eu, 
Zue,LSZH,2005,200501,204,1/1/2005,Arr,"Sw",SWR,"Dar",HA,Tans,A, 
Ba,LSZM,2005,200501,191,1/1/2005,Arr,"AIRF",AFR,"PG",LG,Fr,Eu, 
Zue,LSZH,2005,200501,228,1/1/2005,Dep,"THA",THA,Bang,VD,Th,As,

除了标题行之外,每一行都有一个额外的列。因为它们以“,”结尾。我在我的代码中添加了对此的处理

import csv

f1 = open('LCC.csv', 'rU') 
f2 = open('movements.csv', 'rU')
f3 = open('output.csv', 'w') 

c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)

# first we will read all LCC values into a set.
LCC_row_values = set()
for LCC_row in c1:
    LCC_row_values.add(LCC_row[0].strip())

row = 0
for movements_row in c2:
    row += 1
    if row == 1:
        # movements_row.append('is_present')
        # c3.writerow(movements_row)
        # skip header of moments.csv file
        continue
    # Remove last extra column from output row
    output_row = movements_row[:-1]
    if movements_row[7] in LCC_row_values:
        output_row.append('Yes')
    else:
        output_row.append('No')
    c3.writerow(output_row)

f1.close()
f2.close()
f3.close()

这里是示例文件

LCC.csv

Air Ab 
Jamb 
Sw 
AIRF 
EURO

movements.csv

ap,ic,year,y_m,pas,da,ty,airl,ic_a,dest_orig,ic_d,coun,cont,LCC 
Zue,LSZH,2005,200501,25,1/1/2005,Dep,"EURO",EUJ,"Mans C",EG,Gb,Eu, 
Zue,LSZH,2005,200501,204,1/1/2005,Arr,"Sw",SWR,"Dar",HA,Tans,A, 
Ba,LSZM,2005,200501,191,1/1/2005,Arr,"AIRF",AFR,"PG",LG,Fr,Eu, 
Zue,LSZH,2005,200501,228,1/1/2005,Dep,"THA",THA,Bang,VD,Th,As,

输出.csv

Zue,LSZH,2005,200501,25,1/1/2005,Dep,EURO,EUJ,Mans C,EG,Gb,Eu,Yes
Zue,LSZH,2005,200501,204,1/1/2005,Arr,Sw,SWR,Dar,HA,Tans,A,Yes
Ba,LSZM,2005,200501,191,1/1/2005,Arr,AIRF,AFR,PG,LG,Fr,Eu,Yes
Zue,LSZH,2005,200501,228,1/1/2005,Dep,THA,THA,Bang,VD,Th,As,No

【讨论】:

  • 您好,非常感谢!我调整了您的代码,以便将第 8 列与第 1 列进行比较。但是,我仍然收到一条错误消息: Traceback (last recent call last): File "", line 1, in _csv.Error: new - 在未引用字段中看到的行字符 - 您需要以通用换行模式打开文件吗? >>> 我该怎么办?另外,我不想添加新列,而是填写当前为空的最后一列(第 14 列)。谢谢!
  • 请分享两个 CSV 文件的前 5 行。把它放在原来的问题中。它将帮助我解决您的问题。
  • 请立即查看。你需要输出文件中的标题吗?
  • 我仍然收到完全相同的错误消息: Traceback(最近一次调用最后一次):文件“”,第 7 行,在 _csv.Error: new-line character seen in unquoted字段 - 您需要以通用换行模式打开文件吗?我不需要输出文件中的标题。
  • @AnnaStünzi 第 7 行在 csv 文件中有一些问题。您可以在您共享的示例中添加该行吗..
【解决方案3】:

你试图同时做太多事情。将其拆分为不同的任务。首先,我们将LCC.csv 的内容读入一个集合(我们可以使用列表,但集合更适合确定成员资格)。然后我们会通过movements.csv重写它。

import csv

with open('LCC.csv', 'rb') as lcc:
    lcc_set = set()
    lcc_r = csv.reader(lcc)
    for l in lcc_r:
        for i in l:
            lcc_set.add(i)

with open('movements.csv', 'rb') as movements:
    mov_r = csv.reader(movements)
    with open('output.csv', 'wb') as output:
        out_w = csv.writer(output)
        for l in mov_r:
            #l.pop()
            if l[7] in lcc_set:
                l.append('Yes')
            else:
                l.append('No')
            out_w.writerow(l)

我不清楚您是要添加一列还是替换最后一列。我已注释掉将导致最后一列替换为 YesNo 的行

【讨论】:

  • 嗨帕特里克,也感谢您的帮助。使用您的代码,我收到以下错误消息: Traceback (most recent call last): File "", line 11, in AttributeError: '_csv.writer' object has no attribute 'writerowl' >>> 你呢看到原因了吗?非常感谢!
  • @AnnaStünzi 看起来你缺少括号 writerowl -> writerow(l)
  • 对不起,是的 - 代码不再给出任何错误,但 output.csv 中没有分类,第 14 列中的所有行现在都有条目“否”..
  • 看起来是因为Sw 在一个文件中,"Sw" 在另一个文件中。改为if l[7].strip('"') in lcc_set
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多