Python在每一行中找到匹配的字符串

时间:2018-10-04 05:25:43

标签: python regex string

我想读取csv文件的每一行,并将该行中的每个单词与字符串列表进行匹配。如果该行中出现任何字符串,请将该字符串写在以逗号分隔的行的末尾。 下面的代码没有给我我想要的东西。

file = 'test.csv'    
read_files = open(file)
lines=read_files.read()
text_lines = lines.split("\n")
name=''
with open('testnew2.csv','a') as f:
    for line in text_lines:
        line=str(line)
        #words = line.split()
        with open('names.csv', 'r') as fd:
            reader = csv.reader(fd, delimiter=',')
            for row in reader:
                if row[0] in line:
                   name=row
                   print(name)
                   f.write(line+","+name[0]+'\n')

一个test.csv示例如下:

A,B,C,D
ABCD,,,
Total,Robert,,
Name,Annie,,
Total,Robert,,

names.csv将显示为:

Robert
Annie
Amanda

我想要的输出是:

A,B,C,D,
ABCD,,,,
Total,Robert,,,Robert
Name,Annie,,,Annie
Total,Robert,,,Robert

当前代码将删除不会导致匹配的行,所以我得到了:

Total,Robert,,,Robert
Name,Annie,,,Annie
Total,Robert,,,Robert

3 个答案:

答案 0 :(得分:1)

通过测试row [1]并追加第5列,然后编写,来处理每一行。名单实际上并不是一个csv。如果真的很长,请使用一组进行查找。还要阅读一次以提高效率。

import csv

with open('names.txt') as f:
    names = set(f.read().strip().splitlines())

# newline='' per Python 3 csv documentation...
with open('input.csv',newline='') as inf:
    with open('output.csv','w',newline='') as outf:
        r = csv.reader(inf)
        w = csv.writer(outf)
        for row in r:
            row.append(row[1] if row[1] in names else '')
            w.writerow(row)

输出:

A,B,C,D,
ABCD,,,,
Total,Robert,,,Robert
Name,Annie,,,Annie
Total,Robert,,,Robert

答案 1 :(得分:0)

我认为问题是您仅在名称在行中时才写。要解决此问题,请在if条件之外移动书写调用:

if row[0] in line:
               name=row
               print(name)
f.write(line+","+name[0]+'\n')

我猜该打印语句是出于测试目的?

编辑:再三考虑,您可能还需要在循环内移动name ='',以便在写入每一行后将其重置,这样您就不会从匹配的行中获取名称而渗入到不匹配的行中。 / p>

编辑:决定显示一种实现,该实现应避免连续出现两个匹配名称的(可能)问题:

编辑:将name = row和f.write()中的name [0]调用更改为name = row [0]和f.write()中的name调用

file = 'test.csv'    
read_files = open(file)
lines=read_files.read()
text_lines = lines.split("\n")
with open('testnew2.csv','a') as f:
    for line in text_lines:
        name=''
        line=str(line)
        #words = line.split()
        with open('names.csv', 'r') as fd:
            reader = csv.reader(fd, delimiter=',')
            match=False
            while match == False:
                for row in reader:
                    if row[0] in line:
                       name=row[0]
                       print(name)
                       match=True
                    f.write(line+","+name+'\n')

答案 2 :(得分:0)

也尝试一下:

导入csv

myFile = open('testnew2.csv','wb +')

writer = csv.writer(myFile)

reader2 = open('names.csv')。readlines()

以open('test.csv')作为File1:

reader1 = csv.reader(File1)

for row in reader1:

    name = ""

    for record in reader2:

        record = record.replace("\n","")

        if record in row:

            row.append(record)

        writer.writerow(row)

        break