2015-10-20 748 views
0

我有一个csv文件,我正在尝试读入python,然后我想将前两列存储在名为和名称的变量中。我使用的当前代码如下:在python中读取.csv的特定行数

import csv 
infile = open('blue.csv', 'r') 
csvfile = csv.reader(infile) 

name = [] 
gender = [] 

for row in csvfile: 
    name.append(row[0]) 
    gender.append(row[1]) 

有两个问题,我遇到:

1)CSV文件头,所以我不希望这些包含变量里面,当我存储列

2)我错过了csv文件的最后一行的性别,所以我不想包含csv文件的最后一行时,我将它存储在一个变量。

我是一个R程序员,所以对我来说,我会解决这个问题的方式是读取除第一行和最后一行以外的文件,但我不确定如何在python中执行此操作,或者更好,如果有更好/更聪明的选择。

如果有帮助,这里是一个模拟数据集会是什么样子:

Name, Gender 
Bob, Male 
Susan, Female 
Doug, 
+0

您可以添加您的CSV的样本? – Onilol

+0

我做过了,它在模拟数据集上面。 – user6291

+0

模拟数据集不是我的Python代码。 – user6291

回答

2

你写

我的R程序员,所以对我来说,我会解决这个问题的方法是在文件中读取排除第一排和最后一排,但我不确定如何在Python中做到这一点

这可以用readlines进行,并list slicing像这样:

open('foo.csv').readlines()[1: -1] 

此外,注意csv.reader既需要一个文件对象和一个列表:

csvfile可以是支持迭代器协议及其每个next()方法被调用时返回字符串的任何对象 - 文件对象和列表对象都适合。

所以你可以使用:

for l in csv.reader(open('foo.csv').readlines()[1: -1]): 
    ... 
0

您可以结合使用切片与除环路尝试像这样:

for row in csvfile[1:]: 
    try: 
     gender.append(row[1]) 
     name.append(row[0]) 
    except: 
     continue 

此代码跳过任何没有性别的行,不只是最后一行。

0
import csv 

with open('data.csv', 'r') as f1: 
    numberOflines = len([line for line in f1]) -2 
    f1.seek(0) 
    r = csv.reader(f1) 
    next(r, None) # skip first line 
    for row in r: 
     if numberOflines > 0: 
      print(row[0]) 
      numberOflines -=1 
1

如您的R程序员,我会建议你尝试pandas

1)CSV文件头,所以我不希望这些包含变量里面,当我保存的列

您可以阅读CSV read_csv()这需要照顾头无需任何设置。

2)我错过了csv文件最后一行的性别,所以当我将它存储在一个变量中时,我不想包含csv文件的最后一行。

我觉得你的要求是跳过缺少数据线,您可以使用dropna()

因此,编码部分:

In [1]: import pandas as pd 

In [2]: !cat sample_data.csv 
Name, Gender 
Bob, Male 
Susan, Female 
Doug, 

In [3]: pd.read_csv("./sample_data.csv").dropna() 
Out[3]: 
    Name Gender 
0 Bob  Male 
1 Susan Female