Python-将一些行打印到新文件

时间:2015-03-25 14:42:40

标签: python csv

新手问题.. 我有一个包含3列的大量(2M +行)csv文件

Name : Metric 1 : Metric 2 
BOB :  1000 : 0
SUE :  1200 : 4
SAM : 1250 : 4

如何输出一个新文件,该文件只包含指标2不为零的完整行,并且仍保留标题?

感谢您的帮助

5 个答案:

答案 0 :(得分:0)

您所要做的就是:

  1. 打开csv文件并阅读行;
  2. 扫描线条并查看哪条线路具有您想要的属性;
  3. 在新的csv文件中输出这些行。
  4. 这是一个简单的例子:

    inp = open('input.csv', 'r')
    out = open('output.csv', 'w')
    lines = inp.readlines()
    inp.close()
    
    out.write(lines[0])
    for i, line in enumerate(lines):
        if i > 0:
            cells = line.split(',')
            if int(cells[2]):
                out.write(line)
    
    out.close()    
    

    上面的代码将生成您想要的输出,如下所示:

    INPUT.CSV:             ->  OUTPUT.CSV:
    
    Name,Metric 1,Metric 2     Name,Metric 1,Metric 2
    BOB :  1000 : 0        ->  SUE,1200,4
    SUE,1200,4             ->  SAM,1250,4
    SAM,1250,4
    

答案 1 :(得分:0)

Python的csv模块有一个DictReader对象,可以很好地解决这个问题。我会在运行中读取和写入它们,因为在内存中保存大型数据集可能会在以后出现问题。

您可以检查所需列中的值是否为0.如果不是,请写下该行。

import csv

with open('mycsvinput.csv', 'r') as file_input, open('mycsvoutput.csv', 'w') as file_output:
    csv_reader = csv.DictReader(file_input)
    csv_writer = csv.DictWriter(file_output, fieldnames=csv_reader.fieldnames)

    csv_writer.writeheader()

    for line in csv_reader:
        if line['Metric 2'].strip() != '0':
            csv_writer.writerow(line)

编辑:如果csv中的行在每个值上都有空格填充,则可能需要在检查0之前将其删除

答案 2 :(得分:0)

您可以使用csv模块。

C:\Users\kvivek\Desktop>type test.csv
Name , Metric 1 , Metric 2
BOB ,  1000 , 0
SUE ,  1200 , 4
SAM , 1250 , 4
C:\Users\kvivek\Desktop>python
>>> import csv
>>> reader = csv.reader(open(r'C:\Users\kvivek\Desktop\test.csv'))
>>> for row in reader:
...   if '0' not in row[2] :
...      print row
...
['Name ', ' Metric 1 ', ' Metric 2 ']
['SUE ', '  1200 ', ' 4']
['SAM ', ' 1250 ', ' 4']
>>>

答案 3 :(得分:0)

良好的数据结构和数据分析库是熊猫。 假设您已将数据存储在名为a.txt

的文件中
import pandas

使用Python读取文件(在您的情况下,列用冒号分隔):

table=pandas.read_csv("a.txt",sep=":")

打印以查看您的内容:

print(table)
  Name    Metric 1    Metric 2 
0  BOB         1000           0
1  SUE         1200           4
2  SAM         1250           4

创建一个新数据框,其中仅包含“公制2”为0的行。

table2=table.loc[table[' Metric 2 '] == 0]

打印以检查。

print(table2)
  Name    Metric 1    Metric 2 
0  BOB         1000           0

将过滤后的数据框导出为CSV文件。

table2.csv("a.csv")

答案 4 :(得分:0)

为什么你需要python呢?只需使用headgrep

head -1 your.csv > result.csv 
grep -v ": 0$" your.csv >> result.csv  # since i can't see your exact format, you'll have to make sure that ": 0$" is right...

但是如果你坚持使用python,那就做:

import pandas as pd
df = pd.read_csv('your.csv', sep=':')
df[df['Metric 2'] != 0].to_csv('result.csv')