2013-04-09 55 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

相關問題