为什么我的python文本搜索对csv文件中的某些行可以正常工作,而对其他行不能正常工作?

为什么我的python文本搜索对csv文件中的某些行可以正常工作,而对其他行不能正常工作?,python,text,unicode,text-mining,Python,Text,Unicode,Text Mining,我编写了一个python脚本,用于打开和读取具有以下结构的CSV文件 ID|Search Company|Past Job Title 1|Past Job Title 2|Past Job Title 3| ID|Search Company|Consolidated Company| Past Job Title 1|Past Job Title 2|Past Job Title 3| 然后,它写入一个具有以下结构的CSV文件 ID|Search Company|Past Job Tit

我编写了一个python脚本,用于打开和读取具有以下结构的CSV文件

ID|Search Company|Past Job Title 1|Past Job Title 2|Past Job Title 3|
ID|Search Company|Consolidated Company| Past Job Title 1|Past Job Title 2|Past Job Title 3|
然后,它写入一个具有以下结构的CSV文件

ID|Search Company|Past Job Title 1|Past Job Title 2|Past Job Title 3|
ID|Search Company|Consolidated Company| Past Job Title 1|Past Job Title 2|Past Job Title 3|
我还有以下python代码

input_filename = 'filename.csv'

input_headers = ['ID',
                 'Search Company',
                 'Past Job Title 1',
                 'Past Job Title 2',
                 'Past Job Title 3']

output_headers = ['ID',
                 'Search Company',
                 'Consolidated Company',
                 'Past Job Title 1',
                 'Past Job Title 2',
                 'Past Job Title 3']



#set up the file writer
out_employees_file = open('consolidated_' + input_filename, 'wb')
employees_writer = unicodecsv.DictWriter(out_employees_file, 
lineterminator='\n', escapechar='\\', fieldnames=output_headers)

#set up the file reader
employees_file = open(input_filename, 'r', encoding='utf-8')
employees_reader = csv.reader(employees_file, delimiter=',')


for row in employees_reader:
    consolidated_name = ''
    if 'Searched Company' != row[1]:
        if row[1] in row[2]:
            consolidated_name = row[2]

        if row[1] in row[3]:
            consolidated_name = row[3]

        if row[1] in row[4]:
            harmonized_name = row[4]

    employees_writer.writerow({'ID': row[0],
                           'Consolidated Company':consolidated_name,
                           'Past Job Title 1':row[2],
                           'Past Job Title 2':row[3],
                           'Past Job Title 3':row[4]})
employees_file.flush()
employees_file.close()
我的脚本运行时,问题是它仅在读取CSV文件的某些行时才会表现出预期的行为。出于某种原因,Python只能在CSV文件的某些行中找到我要查找的公司名称

我将给出一个示例输入文件

ID|Search Company|Past Job Title 1|Past Job Title 2|Past Job Title 3|
 1|Good Company  |Bad Company     | Horrid Cmp LLC |Good Company    |
 2|Good Company  |Good Company    | Rotten Company |Stupid Company  |
 3|Good Company  |Stinky Company  | Good Company   |Company Malo    |
这是我得到的输出

ID|Search Company|Consolidated Company|Past Job Title 1|Past Job Title 2|Past Job Title 3|
 1|Good Company  |                    |Bad Company     | Horrid Cmp LLC |Good Company    |
 2|Good Company  |Good Company        |Good Company    | Rotten Company |Stupid Company  |
 3|Good Company  |                    |Stinky Company  | Good Company   |Company Malo    |
我应该在“合并公司”列中为输出文件的每一行获取一个值,因为“好公司”显示在文件的每一行中。然而,我实际上看到的是,我只在一些行中得到一个值


我还没有弄清楚为什么我的脚本对输入文件的某些行有效,但对输入文件的其他行无效。我认为我的脚本要么适用于所有情况,要么适用于所有情况,但事实并非如此,原因是什么?

我修改了您的代码,它可以工作:

import csv
import unicodecsv

input_filename = 'test.csv'

input_headers = ['ID',
                 'Search Company',
                 'Past Job Title 1',
                 'Past Job Title 2',
                 'Past Job Title 3']

output_headers = ['ID',
                  'Search Company',
                  'Consolidated Company',
                  'Past Job Title 1',
                  'Past Job Title 2',
                  'Past Job Title 3']

#set up the file writer
out_employees_file = open('consolidated_' + input_filename, 'wb')
employees_writer = unicodecsv.DictWriter(out_employees_file,
lineterminator='\n', escapechar='\\', fieldnames=output_headers)

#set up the file reader
employees_file = open(input_filename, 'r', encoding='utf-8')
employees_reader = csv.reader(employees_file, delimiter=',')

rows = []

for row in employees_reader:
    consolidated_name = ''
    if 'Search Company' != row[1]:
        if row[1] in row[2]:
            consolidated_name = row[2]

        if row[1] in row[3]:
            consolidated_name = row[3]

        if row[1] in row[4]:
            consolidated_name = row[4]
        r = {'ID': row[0],
             'Search Company': row[1],
             'Consolidated Company': consolidated_name,
             'Past Job Title 1': row[2],
             'Past Job Title 2': row[3],
             'Past Job Title 3': row[4]}
        rows.append(r)
employees_writer.writerows(rows)
您没有在您的版本(搜索的公司)中写入第二行,并且您的if条件中至少有一个类型:

if 'Searched Company' != row[1]:
但这一行被称为“搜索公司”。你错过了“ed”

我认为,这是你的问题的主要原因。您还应该收集行并使用.writerows()写入它们

我的输出:

1,Good Company,Good Company,Bad Company,Horrid Cmp LLC,Good Company
2,Good Company,Good Company,Good Company,Rotten Company,Stupid Compny
3,Good Company,Good Company,Stinky Company,Good Company,Company Malo
我丢弃了标题,我知道

编辑:要包含标题,请添加

employees_writer.writer.writerow(output_headers)
就在之前

employees_writer.writerows(rows)

一是前两个使用“合并公司”,最后一个使用“协调公司”。。。因此,如果它与第[4]行匹配,它将分配错误的变量,并且不会被看到……对
employees\u writer.writerow()
的调用需要位于
for
循环中。否则将只写入最后一行。如果要跳过标题行,请在循环之前使用
employees\u reader.next()
,而不是每次都测试内容。测试也是错误的:
“搜索公司”
应该是
“搜索公司”
@CorleyBrigman是否还有其他原因?这是我为StackOverflow编辑内容时引入的一个打字错误。实际的文件有大约30个不同的字段,但是把它们全部放在我的帖子里是没有意义的。假设最后一个协调名称与前两个相同,最好只粘贴原始代码,并使用Ctl-k将其标记为代码,然后保留缩进。此外,您不会引入与原始版本不同的打字错误。是原始代码中的
协调公司
变量名还是复制错误?是否还有其他原因导致操作失败?我试着做了你做的一些改变,但我仍然有同样的问题。。你试过运行我的版本吗?我又试了一次(从我的答案中抄袭过来),它仍然有效。。我真的认为你的版本中有一些语义错误。请调整“employees\u writer.writerow({'ID':行[0],…”)的缩进,修复if条件中的类型,并仔细检查是否已用正确的变量名称(合并的\u名称)替换了协调的\u名称。或者只需复制我的版本,以验证在代码更改期间没有遗漏任何内容。。