从CSV文件导入数据-为什么它们打印不同的内容?

时间:2018-08-19 11:55:12

标签: python python-3.x csv

采用以下代码:

import csv
# import items with first row
inputfile = open('price.csv', 'r')
reader = csv.reader(inputfile)
rows1 = [row for row in reader] # here
# del first row
rows2 = rows1[1:]
print(rows2)

更改

rows1 = [row for row in reader]

进入

rows1 = [row for row in inputfile]

更改输出:

# with 'reader'
[['6004', '240'], ['6004', '350'], ['6004', '350']]

# with 'inputfile'
['6004,240\n', '6004,350\n', '6004,350\n']

是什么原因造成的?或者说,原理是什么?

3 个答案:

答案 0 :(得分:6)

file对象是可迭代的。在file对象inputfile上进行迭代,将原始(未解析的)行作为字符串对象返回。

您构造了一个csv.reader对象,可以解析这些行。 csv.reader对象也是可迭代的,并且对其进行迭代将返回单个CSV记录的字符串列表。

因此,在inputfile上进行循环时与在reader上进行循环时,得到的结果不同。

答案 1 :(得分:1)

当您通过迭代或使用readline / readlines之类的函数读取行时,Python不会剥离换行符。如果所有行都以换行符结尾,则可以手动将其剥离。

另一件事是,csv.reader从文件对象中读取行并创建列表的迭代器,其中每个列表包含在,或您设置的任何分隔符上分割的行的值,考虑到报价和其他细微差别。

因此,以您的示例为例,您可以执行以下操作:

[row[:-1].split(',') for row in inputfile]

答案 2 :(得分:0)

您需要在遍历文件对象inputfile时显式删除空格

rows1=[row.strip() for row in inputfile]