为什么我的代码给我一个值而不是一个列表

时间:2019-04-03 15:00:36

标签: python list csv indexing

我一直在使用一些CSV文件,我是一个初学者,但是我觉得我很困惑,尽管我不知道为什么当我尝试打印csv文件中的第二列时,python打印列出一个值,而不是第二列中所有值的列表(它们全都是2018-01,因为该列在整个表中都是相同的)。

我的印象是我的代码将每一行的列分为多个单独的列表,因此,如果我想打印sep[1],我将获得每一行第二列的值。尽管目前sep[1]仅给我一个值。

这是我的代码

with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:
        sep = row.split(',')


print (sep[1])!

这是csv文件https://i.stack.imgur.com/ijB1e.jpg

的图像

3 个答案:

答案 0 :(得分:1)

每次循环到新行时,您都将重置sep。假设文件有2行:

with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:  # first loop: 
        sep = row.split(',')  # sep now contains all items in the first row that were separated by commas.
    #second loop: sep now only(!) contains all items in the SECOND row that were separated by commas.

您可以通过在循环内print(sep)的定义之后添加sep来进行测试。

现在,您想要的是每一行的第二列。 string.split(other_string)返回由other_string分隔的字符串的所有单个片段的列表。因此,您可以将这些列表中的每一个存储在新列表中,如下所示:

all_values = []
with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:
        sep = row.split(',')
        all_values.append(sep)  # this is the important part. sep will still be reset every loop, but the values are now stored in all_values.

现在,您有了一个列表列表。要获取所有每个列表的第二个值,请

for l in all_values:
    print(l[1])

您还可以使用执行相同操作的list comprehension

with open('2018-01-btp-street.csv', 'r') as file:
     all_values = [row.split(',') for row in file]

all_values看起来像这样:

[[row1_col1, row1_col2, row1_col3, ...], [row2_col1, row2_col2, row2_col3,...], ...]

或者,改为获取所有列的列表:

with open('2018-01-btp-street.csv', 'r') as file:
     all_values = [row.split(',') for row in file]
all_columns = [[l[i] for l in all_values] for i in range(len(all_values[0]))] 

这将为您提供一个看起来像

的列表
[[row1_col1, row2_col1, row3_col1], [row1_col2, row2_col2, row3_col2], ...]

现在您可以使用

print(all_columns[1])

获取第二列的所有值。

答案 1 :(得分:0)

在您的代码中,file是一个“类似文件”的对象。遍历它会在每次迭代时为您提供字符串,因此row是一个字符串。

调用row.split()返回一个列表。因此sep是一个字符串列表。因此sep[1]确实应该是一个字符串。

csvpandas之类的Python库具有用于列和使用列的抽象,但是在这种情况下,您将不必使用它。

代码示例结尾的

!对我来说似乎不正确。

答案 2 :(得分:0)

您表示要“在第二列中列出所有值”。在那种情况下,您需要在循环内执行print() ...因此您需要缩进函数调用,使其位于循环内。

with open('2018-01-btp-street.csv', 'r') as file:
    for row in file:
        sep = row.split(',')
        print (sep[1])

您的初始代码在循环中运行,然后在循环结束后执行最后一个值的print()