我一直在使用一些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])!
的图像
答案 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]
确实应该是一个字符串。
csv
和pandas
之类的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()
。