如何正确读取csv并输入到列表中?

时间:2012-10-10 15:05:39

标签: python list csv

我试图将.csv文件中的一堆数据读入格式为数组: [[a,b,c,d],[e,f,g,h],...]

运行下面的代码,当我打印带有空格('')的条目时,我访问元素的方式不正确,因为它停在第一个空格('')。 例如,如果Business,Fast Company,Youtube,fastcompany是第10个条目...当我打印下面的内容时,我会分开: 商务,快 公司,YouTube上,FastCompany

关于如何获得结果的任何建议:[[a,b,c,d],[Business,Fast Company,Youtube,fastcompany],[e,f,g,h],...]?

import csv

partners = []
partner_dict = {}
i=9
with open('partners.csv', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
    for row in spamreader:
        partners.append(row)

    print len(partners)

    for entry in partners[i]:
        print entry

2 个答案:

答案 0 :(得分:2)

delimiter参数指定用于将文件的每一行拆分为单独值的字符。由于你正在传递''(空格),读者会分开空格。

如果这是一个以逗号分隔的文件,请使用','作为分隔符(或者只保留delimiter参数,它将默认为',')。

此外,管道字符是引号字符的异常值。您的输入文件是否包含管道而不是引号?您提供的示例数据既不包含管道也不包含

答案 1 :(得分:0)

您的代码存在一些问题:

  • 迭代列表的“正确”语法为for entry in partners:,而不是for entry in partners[i]:
  • 代码中的partners_dict变量似乎未使用,我假设您稍后会使用它,所以我暂时忽略它
  • 您要将文本文件打开为二进制文件(使用open(file_name, "r")代替open(file_name, "rb")
  • 您对处理过的数据的处理仍在上下文管理器内完成(with ... [as ...]: - 阻止)
  • 您的输入文字似乎由", "分隔,但在解析时由" "分隔

如果我理解你的问题,你的问题似乎是由最后一个引起的。 “显而易见的解决方案”可能是将delimeter参数更改为", ",但模块只允许使用单字符串作为分隔符。那么我们该怎么办?好吧,因为","实际上是“真正的”分隔符(它绝不应该在实际的非引用数据中,与空格相反),这似乎是一个很好的解决方案。但是,现在您的所有值都以" "开头,这可能不是您想要的。所以你会怎么做?好吧,所有字符串都有一个非常简洁的strip()方法,默认情况下会删除字符串开头和结尾的所有空格。因此,对于strip()所有值,让我们使用“列表理解”(评估列表中所有项目的表达式,然后返回带有新值的新列表),这看起来有点像[i.strip() for i in row]在将其附加到partners之前。

最后,您的代码应该看起来像这样:

import csv

partners = []

with open('partners.csv', 'r') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
    for row in spamreader:
        partners.append([i.strip() for i in row])

print len(partners)

for entry in partners:
    print entry