删除csv文件中的特定行

时间:2019-07-26 17:29:00

标签: python csv

csv文件如下所示:(还有1000行)

step0:  
141  
step1:  
140   
step2:  
4  
step3:  
139  
step4:  
137  
step5:  
136  
15  
step6:  
134  
13  
139  
step7:  
133  
19  

我试图读取每一行并删除大于27的行(仅包含数字的行)。

最初,我的csv文件是一个字符串文件,因此所有行都被视为字符串。

我要做的是以下事情:

  1. 首先循环浏览其中不包含“ step”的行
  2. 将它们更改为float
  3. 删除所有大于27的

现在,我想在删除这些数字后保存(覆盖)我的文件,但卡住了。
有人可以帮忙吗?

import csv
f = open('list.csv', 'r')
reader = csv.reader(f, delimiter="\n")
for row in reader:
    for e in row:
        if 'step' not in e:
            d=float(e)                  
            if d>27:
                del(d)

3 个答案:

答案 0 :(得分:1)

import csv

with open('output.csv', 'w+') as output_file:
    with open('input.csv') as input_file: #change you file name here
        reader = csv.reader(input_file, delimiter = '\n')

        line_index = 0 # debugging 

        for row in reader:
            line_index += 1 
            line = row[0]
            if 'step' in line:
                output_file.write(line)
                output_file.write('\n')
            else:
                try:
                    number = int(line) # you can use float, but then 30 become 30.0 

                    if number <= 27:
                        output_file.write(line)
                        output_file.write('\n')
                except:
                    print("Abnormal data at line %s", str(line_index)) 

我假设您的输入文件是input.csv。该程序将写入新的输出文件。输出为output.csv:

step0:
step1:
step2:
4
step3:
step4:
step5:
15
step6:
13
step7:
19

答案 1 :(得分:0)

import csv
with open('list.csv', 'r') as list:
    with open('new_list.csv', 'w') as new_list:
        reader = csv.reader(list, delimiter="\n")
        writer = csv.writer(new_list, delimiter="\n")
        for row in reader:
            for e in row:
                if 'step' not in e:
                    if float(e) < 27:
                        writer.writerow(e)
                else:
                    writer.writerow(e)

基本上,您将只复制想要的行到新文件。如果该行是step,我们将其写入。如果该行小于27,则将其写入。如果您只想在完成后覆盖文件:

import csv
rows_to_keep = []
with open('list.csv', 'r') as list:
    reader = csv.reader(list, delimiter="\n")
    for row in reader:
        for e in row:
            if 'step' not in e:
                if float(e) < 27:
                    rows_to_keep.append(e)
            else:
                rows_to_keep.append(e)

with open('list.csv', 'w') as new_list:
    writer = csv.writer(list, delimiter="\n")
    writer.write_rows(rows_to_keep)

答案 2 :(得分:0)

带有re模块的一种解决方案:

import re

with open('file.txt', 'r') as f_in:
    data = f_in.read()

data = re.sub(r'\b(\d+)\n*', lambda g: '' if int(g.group()) > 27 else g.group(), data)

with open('file_out.txt', 'w') as f_out:
    f_out.write(data)

file_out.txt的内容将是:

step0:
step1:
step2:
4
step3:
step4:
step5:
15
step6:
13
step7:
19
26