2010-07-20 57 views
0

所以我提取我使用此程序这个更大的文件要行:程序运行使用CSV MODELE从大文件中提取文本的特定行

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的第一行数据的大型数据集中打印所有相关信息,但是我没有从第二个名字写入到更小文件的其他名称的信息。为什么这不起作用?

+0

你说的是两个文件,但是你的代码显然是一个单一的文件进行操作。另外,名称列表的第二个元素后面有空格。这是故意的吗? – SilentGhost 2010-07-20 17:12:06

+0

@SilentGhost:(1)输入大文件,(2)输出小文件,'assert 1 + 1 == 2' – 2010-07-20 22:03:29

+0

@SilentGhost:他的列表只有一个元素。 – 2010-07-20 22:04:22

回答

1

这是一个字符串列表:

['NAMETHEFIRST,' 'NAMEANOTHERNAME '] 

这是两个字符串列表:

['NAMETHEFIRST', 'NAMEANOTHERNAME '] 

注意逗号的位置。

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

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)