Почему мой код дает мне одно значение, а не список - PullRequest
1 голос
/ 03 апреля 2019

Я работал с некоторыми CSV-файлами, я новичок, но я чувствую, что у меня это получается, хотя я не могу понять, почему, когда я пытаюсь распечатать второй столбец в моем CSV-файле, Python печатаетодно значение, а не список всех значений во втором столбце (все они будут 2018-01, так как этот столбец одинаков во всей таблице).

У меня сложилось впечатление, что мой код разделил столбцы на отдельные списки в каждой строке, поэтому, если бы я хотел напечатать sep[1], я бы получил значение 2-го столбца для каждой строки.Хотя в настоящее время 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 ]

1 голос
/ 03 апреля 2019

Вы сбрасываете 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])

Вы также можете использовать список понимания , который делает то же самое:

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])

чтобы получить все значения второго столбца.

0 голосов
/ 03 апреля 2019

Вы указали, что хотите «список всех значений во втором столбце». В этом случае вам нужно сделать print() внутри цикла ... поэтому вам нужно сделать отступ для вызова функции так, чтобы он был внутри цикла.

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

Ваш исходный код проходит через цикл и затем print() последнего значения после завершения цикла.

0 голосов
/ 03 апреля 2019

В вашем коде file является "файловым" объектом.Итерация по нему дает вам строки на каждой итерации, поэтому row - это строка.

Вызов row.split() возвращает список.Так что sep это список строк.Так что sep[1] действительно должно быть строкой.

Библиотеки Python, такие как csv и pandas, имеют абстракции для столбцов и работы со столбцами, но в этом случае у вас этого не будет.

! в конце вашего примера кода мне не кажется правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...