【问题标题】:How to find specific rows in csv document in python如何在python中查找csv文档中的特定行
【发布时间】:2013-04-09 01:03:32
【问题描述】:

我要做的是读入 csv 文档并在 SN 列 > 20 中查找所有值,然后创建一个新文件,其中仅包含 SN > 20 的行。

我知道我需要做的:

  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 的行并将其转换为新文件?

【问题讨论】:

  • 而不是 'print x' 输出到文件句柄。
  • 在循环前跳过带有next(reader) 的标头,以从正文中删除if-then 语句。

标签: python csv python-2.7


【解决方案1】:

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

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 + ",")

【讨论】:

  • 听起来应该是output_ary.append(row)
  • 这使用了比必要更多的内存;只需在读取时将适当的行打印到输出文件,而不是将它们全部存储在列表中。
  • 当我尝试这样做时,我得到一个 TypeError: expected a character buffer object。这是什么意思?
  • 我的错误,我已修复,请重试。
  • 对不起,回复晚了...它可以工作,但是,我遇到了一个问题,它没有加载所有内容。并且只加载第一行。
【解决方案2】:

在代码中,行的读取/循环非常复杂。它可以通过以下方式清理(并在 Python 中运行得更快):

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

使用列表推导([row for row if f])在 python 中进行了优化,因此它会更有效地执行。并且...您不必创建 reader 数组,这将减少所需的内存,如果 csv 文件很大,也非常方便。

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

希望这会有所帮助!

【讨论】:

  • 这样做的问题是不能将字符串转换为浮点数。
  • 这很有趣,将字符串转换为浮点数是完全可以接受的,例如s = '3', y = float(s)。如果字符串包含非数字字符,您可能会观察到冲突,例如float('3a') 将导致 ValueError。如果字符串中包含引号,也会出现这种情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多