2013-04-09 54 views
3

我想要做的是读入csv文档,并在SN列> 20中找到所有值,并仅创建一个新文件,其中SN> 20。如何在python中查找csv文件中的特定行

我知道,我需要做的:

  1. 读取原始文件
  2. 打开了原始文件的行的新文件
  3. 迭代

我已经能够做的就是找到具有SN的值的行> 20

import csv 
import os 

os.chdir("C:\Users\Robert\Documents\qwe") 

with open("gdweights_feh_robert_cmr.csv",'rb') as f: 
    reader = csv.reader(f, delimiter= ',') 
    zerovar = 0 
    for row in reader: 
     if zerovar==0: 
      zerovar = zerovar + 1 
     else: 
      sn = row [11] 
      zerovar = zerovar + 1 
      x = float(sn) 
      if x > 20: 
       print x 

所以我的问题是我怎么走行与SN> 20,并把它变成一个新的文件?

+0

而不是'打印x'输出到文件句柄。 – 2013-04-09 01:05:28

+0

在循环前用'next(reader)'跳过标题,从主体中删除'if-then'语句。 – chepner 2013-04-09 01:37:16

回答

3

将数据保存在列表中,然后将列表写入文件。

import csv 
import os 

os.chdir(r"C:\Users\Robert\Documents\qwe") 

output_ary = [] 
with open("gdweights_feh_robert_cmr.csv",'rb') as f: 
    reader = csv.reader(f, delimiter= ',') 
    zerovar = 0 
    for row in reader: 
     if zerovar==0: 
      zerovar = zerovar + 1 
     else: 
      sn = row [11] 
      zerovar = zerovar + 1 
      x = float(sn) 
      if x > 20: 
       print x 
       output_ary.append(row) 

with open("output.csv",'w') as f2: 
    for row in output_ary: 
     for item in row: 
      f2.write(item + ",") 
+0

它听起来应该是'output_ary.append(row)' – Jared 2013-04-09 01:11:52

+0

谢谢,我改变了它。 – twasbrillig 2013-04-09 01:15:57

+0

这比使用需要的内存要多得多;只需在输出文件读取时将适当的行打印到输出文件中,而不是将它们全部存储在列表中。 – chepner 2013-04-09 01:38:33

0

在代码中,读/循环遍历行非常复杂。它可以被清理(和运行在Python更快)以下各项:

with open('gdweights_feh_robert_cmr.csv', 'rb') as f: 
    output_ary = [row for row in f if float(row[11]) > 20] 

使用列表理解([一行行,如果F])在蟒蛇优化,因此它会更有效地瓶坯。 AND ...避免必须创建reader数组,这将减少所需的内存,如果csv文件很大,也非常方便。

然后,您可以按照其他答案中的建议继续写出outout_ary。

希望这有助于!

+0

与此问题是,您不能将字符串转换为浮动。 – 2013-04-10 03:29:31

+0

有趣的是,将一个字符串作为浮点数来输入是完全可以接受的。 's ='3',y =浮点(s)'。如果字符串包含非数字字符,则可能会发生冲突float('3a')将导致ValueError。如果字符串包含引号符号,这也会发生 – 2013-04-10 03:35:33

相关问题