我需要从具有特定模式的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()
我出错的任何提示?
答案 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)
你使用其中一种吗?脚本不会自行运行。
使用您的脚本进行更明确的业务:
脚本中使用的输入变量dello究竟是什么。有一行使用字符串'dello'而不是参数dello。你在这里做了什么
您是否在input_csv文件的同一文件夹中运行它。 input_csv是完整的文件名还是input_csv.csv。
您正在使用input_csv作为变量,该变量为空并且会失败,如果这不是包含文件名的变量(从文件中的某个位置开始),则应将文件名称为字符串:'input_csv.csv'
您评论道:#i不知道如何剥离它? 究竟是什么问题,你是什么意思?使用strip()。别的什么?
你的脚本在函数之前导入了csv吗?如果不是......什么都行不通。
在处理文件时,始终建议使用with
。处理异常和自动文件关闭。你可以在很多地方阅读。
类似的东西:
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]:
dello
因此,正确的测试应该是:
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)