使用csv modele从较大的文件中提取特定的文本行

时间:2010-07-20 17:09:09

标签: python csv

所以我正在使用这个程序从这个更大的文件中提取出我想要的行:

import csv

name = ['NAMETHEFIRST,' 'NAMEANOTHERNAME ']
data = csv.reader(open('C:\\bigfile.csv'))

with open('C:\\smalldataset.xcl','w') as outf:
    csv.writer(outf).writerows(l for l in data if l[0] in name)

程序运行。但是我只从NAMETHEFIRST获取数据行,并且没有写入NAMETHEOTHERNAME的数据写入我的小数据集文件。这完全符合我想要从NAME THE FIRST的数据行的大数据集打印所有相关信息,但我没有从第二个名称获得信息,其他名称写入较小的文件。为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

这是一个包含一个字符串的列表:

['NAMETHEFIRST,' 'NAMEANOTHERNAME ']

这是一个包含两个字符串的列表:

['NAMETHEFIRST', 'NAMEANOTHERNAME ']

请注意逗号的位置。

另请注意,您的第二个字符串末尾有一个空格。

答案 1 :(得分:1)

这行代码

name = ['NAMETHEFIRST,' 'NAMEANOTHERNAME ']

相当于

name = ['NAMETHEFIRST,NAMEANOTHERNAME ']

因为Python在编译时连接相邻的字符串常量后跟随C。

你说“”我只是从NAMETHEFIRST获取数据行而我没有从NAMETHEOTHERNAME写入我的小数据集文件“”“ - 但是您显示的代码不会产生该结果;它只会选择以

开头的行
"NAMETHEFIRST,NAMEANOTHERNAME ", 

只有当该行实际为:

时,您才能获得所述结果
name = ['NAMETHEFIRST', 'NAMEANOTHERNAME ']

这可能是因为文件中的第二个名称没有上面的尾随空格。

其他问题:

csv.writer(outf).writerows(l for l in data if l[0] in name)试图变得有点过于聪明。如果你把它分解成一口大小的块,你可以更容易地使用调试器或只是打印语句来向你展示实际发生的事情。

试试这个:

print len(name), name
data = csv.reader(open('C:\\bigfile.csv', 'rb')) # ALWAYS open csv files in BINARY mode
with open('C:\\smalldataset.xcl','wb') as outf: # ALWAYS open csv files in BINARY mode
    writer = csv.writer(outf)
    for row_index, row in enumerate (data): # don't use 'l' as a variable name
        print row_index + 1, row
        if row[0] in name:
            writer.writerow(row)