删除线条图案

时间:2013-02-05 18:37:50

标签: python csv

我需要从具有特定模式的csv中删除一行

这就是我的csv文件的外观。

lbm,16730,0
namd,16733,6
namd,16731,2
namd,16732,4

如果我想删除带有16730模式的行,并按原样输出文件的其余部分..

所以,输出如下:

namd,16733,6
namd,16731,2
namd,16732,4

我该怎么做?

这是我在互联网上的一些文件的帮助下写的一个小脚本

def delete_line(dello):
    opener = open(input_csv, 'rb')
    dataset = csv.reader(opener, delimiter=',')
    output = []
    for line in dataset:
            if 'dello' == line[1]:
                    print line[1]
                    #i dont know how to strip it here
                    output.append(line)
    opener.close()
    fn = input_csv
    f = open(fn,'w')
    f.writelines(output)
    f.close()

我出错的任何提示?

4 个答案:

答案 0 :(得分:1)

如果您选择关注uʍopǝpısdn的建议并选择grep,那么这将有效:

grep -v ",16370," path/to/file > path/to/new_file

假设文件的结构与示例中的结构类似,并且在所有文件中都是一致的,但是......

只是FYI,在grep中,-v表示反向匹配,返回包含指定模式的所有结果。

编辑: 如果需要保留原始文件,可以使用临时文件,然后将其名称恢复为原始文件:

grep -v ",16370," path/to/file > path/to/new_file && rm path/to/file && mv path/to/new_file path/to/file

答案 1 :(得分:1)

如果你需要python,那就用这个:

def delete_line(dello):
    data = open("abc.csv").readlines()

    i = 0
    for line in data:
        if dello in line:
            data.pop(i)
        i += 1

    open("abc.csv", "w").write("".join(data))

delete_line("16732")

输入:

lbm,16730,0
namd,16733,6
namd,16731,2
namd,16732,4

输出:

lbm,16730,0
namd,16733,6
namd,16731,2

注意:这将删除与该字符串匹配的所有条目。


<强>更新

修改您的代码:

import csv

def delete_line(dello):
    opener = open("abc.csv", 'rb')
    dataset = csv.reader(opener, delimiter=',')
    output = []
    for line in dataset:
        # Add to output only if not matching the string
        if dello != line[1]:
            # Need join as line is a list
            output.append(",".join(line) + "\n")
    opener.close()

    fn = "abc.csv"
    f = open(fn,'w')
    f.writelines(output)
    f.close()

delete_line("16730")

如果您需要删除条目,可以使用dataset.pop(index)

答案 2 :(得分:0)

有两种方法可以像这样运行python脚本:

首先:在文件中添加部分,如:

if __name__ == "__main__":
    delete_line(some_paramter)

然后从命令行运行:

python scriptfilename.py

或来自python shell:

from scriptfilename import delete_line
delete_line(some_parameter)
你使用其中一种吗?脚本不会自行运行。

使用您的脚本进行更明确的业务:

  1. 脚本中使用的输入变量dello究竟是什么。有一行使用字符串'dello'而不是参数dello。你在这里做了什么

  2. 您是否在input_csv文件的同一文件夹中运行它。 input_csv是完整的文件名还是input_csv.csv。

  3. 您正在使用input_csv作为变量,该变量为空并且会失败,如果这不是包含文件名的变量(从文件中的某个位置开始),则应将文件名称为字符串:'input_csv.csv'

  4. 您评论道:#i不知道如何剥离它? 究竟是什么问题,你是什么意思?使用strip()。别的什么?

  5. 你的脚本在函数之前导入了csv吗?如果不是......什么都行不通。

  6. 在处理文件时,始终建议使用with。处理异常和自动文件关闭。你可以在很多地方阅读。

  7. 类似的东西:

    with open('file.csv','rb') as f:
        dataset = csv.reader(f)
        #the rest. and you don't need closing etc..'
    

答案 3 :(得分:0)

第一个问题:

if 'dello' == line[1]:
  1. 您可以使用引用
  2. 来引用dello
  3. 你的逻辑是反向的。
  4. 因此,正确的测试应该是:

    if dello != line[1]:
    

    第二个问题:您将文件读取为CSV,但将其写为普通文件。您应该通过读取和写入作为普通文本文件或CSV来保持一致。将它们混合使得很难获得正确的输出。

    第三个不是真正的问题,而是一个建议:不要硬编码文件名,将其传递给你的函数。这样,你的功能更加通用。

    这是我建议的代码:

    def delete_line(input_csv, dello):
        with open(input_csv, 'rb') as f:
            csv_reader = csv.reader(f)
            output = []
            for line in csv_reader:
                if dello not in line:
                    output.append(line)
    
        with open(input_csv, 'wb') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerows(output)