【问题标题】:Reading CSV files and rewriting them without certain rows Python读取 CSV 文件并在没有某些行的情况下重写它们 Python
【发布时间】:2013-08-08 23:21:15
【问题描述】:

我是编程新手。我在一个文件夹中有数百个 CSV 文件,某些文件在第二列中有字母 DIF。我想重写没有这些行的 CSV 文件。我尝试为一个文件执行此操作,并将我的尝试放在下面。我还需要帮助让程序为我目录中的所有文件执行此操作。任何帮助,将不胜感激。

谢谢

import csv

reader=csv.reader(open("40_5.csv","r"))


for row in reader:
if row[1] == 'DIF':
    csv.writer(open('40_5N.csv', 'w')).writerow(row)

【问题讨论】:

    标签: python csv if-statement for-loop


    【解决方案1】:

    我对您的代码做了一些更改:

    import csv
    import glob
    import os
    
    fns = glob.glob('*.csv')
    
    for fn in fns:
        reader=csv.reader(open(fn,"rb"))
    
    
        with open (os.path.join('out', fn), 'wb') as f:
            w = csv.writer(f)
            for row in reader:
                if not 'DIF' in row:
                    w.writerow(row)
    

    glob 命令生成当前目录中所有以 .csv 结尾的文件的列表。如果您想将源目录作为程序的参数,请查看 sys.argv 或 argparse(尤其是后者对于命令行解析非常强大)。

    在 'w' 模式下打开文件时还必须小心:这意味着截断文件,即在循环中,您总是会覆盖现有文件,最终只显示一个 csv 行。

    目录“out”必须存在,否则脚本将产生 IOError。

    链接: open sys.argv argparse glob

    【讨论】:

    • 这个答案很接近,但有一个主要问题和几个小问题。不要为每个输入行创建一个新的writer!不太重要的是,使用os.path.join 创建输出文件路径而不是硬编码的“/”分隔符是一种更好的做法。正如文档所指出的,输入和输出文件都应该以二进制模式打开(分别为“rb”和“wb”)。 docs.python.org/2/library/csv.html#csv.reader
    • 我会添加你的建议。
    • 对于 OP - 如果您真的只想在第二列中检查“DIF”,并且仍然在其他列中写入包含它的行,请将 if not 'DIF' in row: 检查替换为 if row[1] != 'DIF':
    • 非常感谢。通过一些小的修改,这很完美。
    【解决方案2】:

    Most sequence types support the in or not in operators,用于测试值比计算索引位置要简单得多。

    for row in reader:
        if not 'DIF' in row:
            csv.writer(open('40_5N.csv', 'w')).writerow(row)
    

    【讨论】:

      【解决方案3】:

      如果您愿意安装 numpy,您还可以使用 recfromcsv 或更通用的 genfromtxt(genfromtxt 要求您指定逗号分隔符)将 csv 文件读入方便的 numpy 数组格式,并且您可以指定哪些行和要忽略的列。可以在此处找到 genfromtxt 的文档:

      http://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html

      这里是recfromcsv:http://nullege.com/codes/search/numpy.recfromcsv?fulldoc=1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-01
        • 2020-11-12
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 2023-02-23
        相关资源
        最近更新 更多