Python CSV阅读 - 我想我正在列出一个列表,但我只想要一个列表

时间:2017-08-10 03:38:55

标签: python csv

这涉及到Python 2.7

我有一个csv文件,soq1,在记事本中看起来像这样:

csv file in Notepad

我使用此代码读取文件并显示列表soq1的内容:

import csv
with open('D:\Users\Richard\Python\soq1.csv','rb') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    soq1=list(readCSV)

print(soq1)
print(type(soq1))
print(len(soq1))

结果: results

我期待soq1看起来像: [ '2', '3', '4', '5', '6']

换句话说,我没想到会有额外的方括号。 我是否创建了一个列表列表?

我做错了什么?

6 个答案:

答案 0 :(得分:2)

是的,您创建了一个列表列表,但这是故意的,因为从本质上讲,CSV文件具有由新行分隔的单独条目,以及用逗号分隔的每个条目中的单独属性(为什么它们将其称为逗号分隔值)。

顺便说一下,这不是一个合适的CSV文件。惯例是第一行(也称为标题行)应该表示逗号分隔的字符串,描述每个值在连续的行/条目中的含义。

如果您想阅读该文件并生成['2','3','4','5','6'],则csv.reader不适合您的特定用例。您将需要读取每个单独的行并将其附加到列表中,或者读取整个文件并使用\n作为分隔符将其拆分为列表。

答案 1 :(得分:1)

每个数字都在一个单独的行上,这导致csv读者认为它们是单独的行而不是列。你应该更改csv文件,因为这不是一行csv文件的正确格式。

答案 2 :(得分:1)

你没有做错任何事 - csv模块每行只返回一个列表(这对于每行中有多个条目的CSV都有意义。)

您可以使用

拼合您的列表
soq2 = [elt for lst in soq1 for elt in lst]

虽然对于这样一个简单的文件,您根本不需要将其作为CSV处理(文件扩展名并不重要。)您可以这样做:

with open(my_file) as f:
    soq1 = [line.strip() for line in f]

答案 3 :(得分:1)

csv.reader为文件中的每一行创建一个列表。在大多数情况下这是有道理的,因为大多数csv文件不是单个列。

您可以随时理解列表:

foo = [item for inner in outer for item in inner]

答案 4 :(得分:1)

改进了代码

import csv
with open('D:\Users\Richard\Python\soq1.csv','rb') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    soq1=list(readCSV) #commnt this line
    for line in readCSV:
        print line
        print type(line)
        print len(line)

#print(soq1)
#print(type(soq1))
#print(len(soq1))

答案 5 :(得分:1)

决定将我的评论转移到你的问题答案,因为我觉得这里的所有答案都没有反映出你想要实现的目标。

您会看到一个列表列表,因为CSV中的每一行通常都有多列。

如果不是这样,为什么要做所有的CSV内容呢?您只需将文本文件读入平面列表即可。

How do I read a file line-by-line into a list?

  

lines = tuple(open(filename, 'r'))